【问题标题】:Calling ViewController function from another .swift file从另一个 .swift 文件调用 ViewController 函数
【发布时间】: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()

【问题讨论】:

    标签: swift xcode model-view-controller viewcontroller


    【解决方案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()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2020-05-30
      • 2012-05-10
      • 2013-12-17
      • 2020-11-04
      相关资源
      最近更新 更多