从appdelegate更新viewcontroller - 最佳实践?

时间:2015-03-21 03:04:46

标签: swift viewcontroller appdelegate delegation

我正在玩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就更好的选择。

有什么建议吗?

2 个答案:

答案 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
    }
)