现在我有一个rootViewController
,其UIPageViewController
是唯一的子视图,rootViewController
基本上是UIPageViewController
的包装类。现在,我想要从UIPageViewController
(由ViewControllerA
拥有)禁用rootViewController
的滚动。
现在我已经为ViewControllerA
实现了一个委托方法(由rootViewController
创建),告诉UIPageViewController
它必须停止滚动,具体取决于ViewControllerA
给出的信息。但是,ViewControllerA
能够调用rootViewController
实现的委托方法,则rootViewController
需要ViewControllerA
的实例变量。
这是最好的做法吗?使用NSNotificationCenter
会更好吗?或者这些方法都不是最佳选择吗?
答案 0 :(得分:1)
最佳做法是使用委托或回调属性:
final class ViewControllerA: UIViewController
{
var callback: (ViewControllerA -> ())?
func somethingHappened()
{
callback?(self)
}
}
如果你正在使用这种风格,请务必避免参考周期:
let viewControllerA = ViewControllerA()
viewControllerA.callback = { [weak self] _ in ... }
如果您正在使用委托,请使用weak var
避免参考周期:
weak var delegate: ViewControllerADelegate?
这些样式比NSNotificationCenter
更受欢迎,因为它们更具有类型安全性,可读性和灵活性。
答案 1 :(得分:0)
有很多方法可以解决您的问题。如果你可以设置为ViewControllerA添加一个rootViewController变量,并且能够在创建ViewControllerA期间设置它,那么这将是调用它的最快方法。当涉及多个线程时,我通常使用NSNotificationCenter。因此,如果我有一个异步任务正在运行,比如HTTP调用,并且它需要应用程序根据结果做出相应的反应,使用NSNotificationCenter是一个不错的选择,因为它可以轻松地在应用程序范围内发送消息,你只需要添加一个观察者,取决于信息。