Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIViewController';s委托变量变为零_Ios_Swift_Delegates - Fatal编程技术网

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")
}
}

My
NotesListController

protocol NotesListViewControllerDelegate:class {
    func plusButtonDidSelect()
}

class NotesListViewController: UIViewController {

    weak var delegate:NotesListViewControllerDelegate? {
        didSet {
           print("delegate = \(delegate)")
        }
    }
系统在
didSet
中显示设置了什么变量。但是在
viewdiload
self.delegate
中已经有
nil
值。有什么问题吗

编辑:my
didFinishLaunchingWithOptions
方法:

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?@ishmeetsigh
viewDidLoad
NotesListViewController
。在哪里实例化Navigator?@Leonardo在
appDelegate
类中。它设置
rootViewController
。您指的是哪个视图控制器viewDidLoad?@ishmeetsigh
viewDidLoad
NotesListViewController
。didfishlaunchingwithoptions中的navigator变量是函数的本地变量,因此函数一完成,它就超出了范围。因为它是唯一一个维护对Navigator()对象的引用的对象,所以这导致委托变为零。在更大的范围内移动变量(例如appDelegate)可使其在函数调用之外保持活动状态。存在完全相同的问题。我所需要做的就是将创建的导航器保存到AppDelegate中的本地变量中,以使其工作。didFinishLaunchingWithOptions中的导航器变量是函数的本地变量,因此它在函数完成后立即超出范围。因为它是唯一一个维护对Navigator()对象的引用的对象,所以这导致委托变为零。在更大的范围内移动变量(例如appDelegate)可使其在函数调用之外保持活动状态。存在完全相同的问题。我所需要做的就是将创建的导航器保存到AppDelegate中的本地变量中,以使其工作。