Ios UIViewController';s委托变量变为零
我已经阅读了所有的文章,但找不到解决方案。我有一个类来组织控制器之间的导航:Ios UIViewController';s委托变量变为零,ios,swift,delegates,Ios,Swift,Delegates,我已经阅读了所有的文章,但找不到解决方案。我有一个类来组织控制器之间的导航: class Navigator: NotesListViewControllerDelegate { var rootController:UINavigationController! lazy private var notesListController:NotesListViewController! = { let controller = NotesListViewController(nibNa
class Navigator: NotesListViewControllerDelegate {
var rootController:UINavigationController!
lazy private var notesListController:NotesListViewController! = {
let controller = NotesListViewController(nibName: String(NotesListViewController), bundle: nil)
controller.title = "Notes"
return controller
}()
init() {
self.rootController = UINavigationController.init(rootViewController: self.notesListController)
self.notesListController.delegate = self
}
//MARK: NotesListController delegate
func plusButtonDidSelect() {
print("plus button did select")
}
}
MyNotesListController
:
protocol NotesListViewControllerDelegate:class {
func plusButtonDidSelect()
}
class NotesListViewController: UIViewController {
weak var delegate:NotesListViewControllerDelegate? {
didSet {
print("delegate = \(delegate)")
}
}
系统在didSet
中显示设置了什么变量。但是在viewdiload
self.delegate
中已经有nil
值。有什么问题吗
编辑:mydidFinishLaunchingWithOptions
方法:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow.init(frame: UIScreen.mainScreen().bounds)
let navigator = Navigator()
if let window = self.window {
window.backgroundColor = UIColor.whiteColor()
window.rootViewController = navigator.rootController
window.makeKeyAndVisible()
}
return true
}
edit2我解决了这个问题,将
navigator
变量从didfishlaunchingwithoptions
方法中取出到其他类变量(它变得像obj-c中的strong属性)。但当它在didfishlaunchingwithoptions
方法中声明为localy时,为什么系统不将其保留在内存中?什么是维护对Navigator实例的引用
NotesListViewController实例只有一个弱引用,因此,如果没有其他任何东西使Navigator保持活动状态,它将超出范围,并且在notesListController中委托变量将变为零(我假设它在其他地方被引用,因为它正在呈现)是什么在维护对Navigator实例的引用
NotesListViewController实例只有一个弱引用,因此如果没有其他任何东西使Navigator保持活动状态,它将超出范围,并且在notesListController中委托变量将变为零(我假设它在别处被引用,因为它被呈现)在哪里实例化Navigator?@Leonardo在
appDelegate
类中。它设置rootViewController
。您谈论的是哪个视图控制器viewDidLoad?@ishmeetsighviewDidLoad
的NotesListViewController
。在哪里实例化Navigator?@Leonardo在appDelegate
类中。它设置rootViewController
。您指的是哪个视图控制器viewDidLoad?@ishmeetsighviewDidLoad
的NotesListViewController
。didfishlaunchingwithoptions中的navigator变量是函数的本地变量,因此函数一完成,它就超出了范围。因为它是唯一一个维护对Navigator()对象的引用的对象,所以这导致委托变为零。在更大的范围内移动变量(例如appDelegate)可使其在函数调用之外保持活动状态。存在完全相同的问题。我所需要做的就是将创建的导航器保存到AppDelegate中的本地变量中,以使其工作。didFinishLaunchingWithOptions中的导航器变量是函数的本地变量,因此它在函数完成后立即超出范围。因为它是唯一一个维护对Navigator()对象的引用的对象,所以这导致委托变为零。在更大的范围内移动变量(例如appDelegate)可使其在函数调用之外保持活动状态。存在完全相同的问题。我所需要做的就是将创建的导航器保存到AppDelegate中的本地变量中,以使其工作。