从另一个 .swift 文件调用 ViewController 函数
Posted
技术标签:
【中文标题】从另一个 .swift 文件调用 ViewController 函数【英文标题】:Calling ViewController function from another .swift file 【发布时间】:2020-08-02 10:11:22 【问题描述】:我有一个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()
它在ViewController()
初始化行上给了我Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec870fe8)
错误。
我也尝试过:
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 只在开始时被调用一次。
一旦receiveData()
func 在另一个文件中完成,我该怎么做才能在ViewController
中调用reloadData()
?
【问题讨论】:
【参考方案1】:您可以使用delegation pattern
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()
【讨论】:
以上是关于从另一个 .swift 文件调用 ViewController 函数的主要内容,如果未能解决你的问题,请参考以下文章
Swift:如何从另一个类 X 更新 UILabel:UIButton
如何在swift中按下按钮从另一个xib文件加载另一个xib文件