从另一个 .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 Swift - 从另一个类调用一个方法

从另一个类Swift调用一个类的函数

Swift:如何从另一个类 X 更新 UILabel:UIButton

如何在swift中按下按钮从另一个xib文件加载另一个xib文件

Swift 致命错误:在 segue 上展开 Optional 值时意外发现 nil

从另一个文件中的 SKScene 中删除 UIView