swift - 从另一个 .swift 文件调用 ViewController 函数
问题描述
一旦收到某些数据,我就有一个collectionView
想要的。reloadData()
问题是:我不知道如何从另一个处理数据的 .swift 文件中调用 ViewController 函数。我试着做:
class WebSocketLogic: WebSocketDelegate {
var viewController = ViewController()
var columns = 0
var rows = 0
...
func receiveData {
...
columns = map.count
rows = map[0].count
viewController.collectionView.reloadData()
}
}
它在初始化行时给了我Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec870fe8)
错误。
我也尝试过:ViewController()
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
var webSocket = WebSocketLogic(roomId: 1)
var columns = 0 {
didSet {
collectionView.reloadData()
print("columns number set to: \(columns)")
}
}
var rows = 0
override func viewDidLoad() {
super.viewDidLoad()
webSocket.setupStarScream()
columns = webSocket.columns
rows = webSocket.rows
}
}
但是由于某种原因, didSet 只在开始时被调用一次。一旦funcreloadData()
在另一个文件中完成,我该怎么做才能调用?ViewController
receiveData()
解决方案
您可以使用委托模式
protocol DataDelegate {
func dataReceived()
}
class WebSocketLogic: WebSocketDelegate {
var delegate: DataDelegate?
var columns = 0
var rows = 0
...
func receiveData {
...
columns = map.count
rows = map[0].count
delegate?.dataReceived()
}
}
class ViewController: UIViewController, DataDelegate {
@IBOutlet weak var collectionView: UICollectionView!
var webSocket = WebSocketLogic(roomId: 1)
var columns = 0 {
didSet {
collectionView.reloadData()
print("columns number set to: \(columns)")
}
}
var rows = 0
override func viewDidLoad() {
super.viewDidLoad()
webSocket.delegate = self
webSocket.setupStarScream()
columns = webSocket.columns
rows = webSocket.rows
}
func dataReceived() {
collectionView.reloadData()
}
}
推荐阅读
- regex - 聊天机器人问题 - 无限递归 - Codecademy 问题
- c - C 中的静态 const char* VS const char*
- android - SoundPool 和 MediaPlayer 循环播放的哔声在一段时间后停止
- java - 实现 Comparable 接口的问题
- django - 如何验证表单更新时已存在的字段
- perl - 从变量中包含的代码和文件中打印 unicode 字符
- android - 自工具过时以来如何运行 uiautomatorviewer?
- java - 此系统上未安装 Java 编译器
- hadoop - 在 HDFS 上,我想显示以 ORC 格式存储的配置单元表的普通文本
- r - 如何在ggplot2中标记条形图