我正在玩iBeacons在AppDelegate.swift中实现CoreLocation方法(方法在AppDelegate中实现,以确保应用程序背景功能)
在“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)
ViewController.swift:
在viewDidLoad方法中:
(UIApplication.sharedApplication().delegate as AppDelegate).locationDelegate = self
(我发现这看起来很丑陋 - 将这个属性声明为委托更好的方法吗?)
协议实施:
func minorBeaconChanged(minorValue: NSNumber) {
// do fancy stuff here
}
2)通过在AppDelegate中创建对ViewController的引用:
let viewController:ViewController = window!.rootViewController as ViewController
viewController.doSomethingFancy()
这两种方法对我来说都很好,但我认为通过委托的第一种方法更优雅,一旦你有多个ViewControllers就更好的选择。
有什么建议吗?
答案 0 :(得分:1)
我认为第二种解决方案要容易得多。它还确保视图控制器不会耗尽内存(#34;已发布")并且应用程序委托不会尝试联系不存在的对象。
另外,在多个控制器的情况下,我不理解委托参数。在这种情况下,你必须有多个代表,真的不是一个理想的情况。或者您必须从外部将委托更改为不同的视图控制器 - 也不是非常优雅且风险很大。
对于多视图控制器方案,我建议通过NSNotificationCenter
进行通知。这是一个丢失耦合,它只确保那些需要响应的对象接收消息。视图控制器应在创建时开始侦听通知,并在通知中心消失时从通知中心取消注册。
答案 1 :(得分:1)
这个怎么样?
在AppDelegate中
var minorBeaconChanged: NSNumber -> () = { minor in }
在更新位置时调用此方法。
在ViewController的viewWillAppear
中( UIApplication.sharedApplication().delegate as? AppDelegate )!.minorBeaconChanged = { minor in
// Do with minor
}
编辑:27/8/2015
如果你想要多个观察员。
在AppDelegate中
var minorBeaconObservers: [ NSNumber -> () ] = []
并使用'minor'
调用minorBeaconObservers中的所有项目在ViewController的viewWillAppear
中( UIApplication.sharedApplication().delegate as? AppDelegate )!.minorBeaconObservers.append(
{ minor in
// Do with minor
}
)