从另一个 .swift 文件调用 ViewController 函数
Calling ViewController function from another .swift file
我有一个 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()
?
您可以使用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()
}
}
我有一个 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()
?
您可以使用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()
}
}