And*_*ndy 6 delegation viewcontroller appdelegate swift
我正在与iBeacons一起在AppDelegate.swift中实现CoreLocation方法(在AppDelegate中实现方法以确保App后台功能)
在“ ViewController.swift”随附的SingleView应用程序中,将数据从AppDelegate传递到ViewController以更新视图(例如UIImages,UILabels或UITableViews)的最佳实践是什么?
我已经成功实现了两种不同的方法:
1)委托,通过在AppDelegate.swift中触发Viewcontroller委托方法:
protocol BeaconLocationDelegate { func minorBeaconChanged(minorValue:NSNumber) }
var locationDelegate: BeaconLocationDelegate
locationDelegate?.minorBeaconChanged(nearestBeacon.minor)
Run Code Online (Sandbox Code Playgroud)
ViewController.swift:
在viewDidLoad方法中:
(UIApplication.sharedApplication().delegate as AppDelegate).locationDelegate = self
Run Code Online (Sandbox Code Playgroud)
(我发现这看起来很难看-将此属性声明为委托的更好方法吗?)
协议实现:
func minorBeaconChanged(minorValue: NSNumber) {
// do fancy stuff here
}
Run Code Online (Sandbox Code Playgroud)
2)通过在AppDelegate中创建对ViewController的引用:
let viewController:ViewController = window!.rootViewController as ViewController
viewController.doSomethingFancy()
Run Code Online (Sandbox Code Playgroud)
两种方法对我来说都很好用,但是我认为通过委派的第一种方法更优雅,并且在拥有多个ViewController时是更好的选择。
有什么建议吗?
我认为第二种解决方案要容易得多。它还确保视图控制器不会耗尽内存(被“释放”),并且应用程序委托不会尝试联系不存在的对象。
另外,我不理解在多个控制器的情况下的委托参数。在这种情况下,您将必须拥有多个代表,这确实不是理想的情况。或者你必须从外部将委托更改为不同的视图控制器 - 也不是很优雅并且风险很大。
对于多视图控制器场景,我建议通过NSNotificationCenter. 这是一种松散耦合,可确保只有那些需要做出反应的对象才能收到消息。视图控制器应该在创建时开始监听通知,并在通知消失时从通知中心取消注册。
| 归档时间: |
|
| 查看次数: |
2548 次 |
| 最近记录: |