【问题标题】:Delegate not being called (instantiateViewControllerWithIdentifier)未调用委托 (instantiateViewControllerWithIdentifier)
【发布时间】:2014-06-16 16:08:53
【问题描述】:

我的故事板中有 5 个 CalculatorViewController 实例,但只有一个具有标识符“secondOperationViewController”。其中 3 个使用嵌入 segue 与我的初始 ViewController 连接,名为 ContainerViewController。

我希望标识符为“secondOperationViewController”的 ViewController 从我的 ContainerViewController 调用方法,但我无法正确实例化它,因此不会调用委托方法。这是我的代码的一部分:

override func viewDidLoad() {
    super.viewDidLoad()
    secondOperationViewController = storyboard.instantiateViewControllerWithIdentifier("secondOperationViewController") as? CalculatorViewController
    secondOperationViewController!.delegate = self
    println(secondOperationViewController)
}

有什么建议吗?

我也发现了类似的问题:

Delegate in Swift-language

我将 CalculatorViewController 的实例重写为:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        secondOperationViewController = segue!.destinationViewController as? CalculatorViewController
        secondOperationViewController!.delegate = self;
    }

它可以工作,但是我的委托方法被所有 3 个 ViewControllers 调用,连接到初始 ViewController,所以我需要另一个解决方案。

那么我怎样才能从具有指定标识符的 ViewController 中调用委托方法呢?有什么想法吗?


因此,embed segue 不适用于“instantiateViewControllerWithIdentifier”(但适用于模态呈现的 segue)。我不知道为什么。这是嵌入segue的解决方案:

override func viewDidLoad() {
    super.viewDidLoad()
    let secondOperationViewController:CalculatorViewController = childViewControllers[0] as CalculatorViewController
    secondOperationViewController.delegate = self
}

【问题讨论】:

    标签: ios uiviewcontroller delegates swift instantiation


    【解决方案1】:

    在故事板中给你的segue一个唯一的标识符:

    然后在您的prepareForSegue 中检查,然后再设置委托,这样您就可以准确地知道何时设置该委托。

    override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        // Checking to make sure this is the correct segue. This is also protection for the "as?"
        if segue?.identifier == "SecondOVCSeuge" {
            secondOperationViewController = segue!.destinationViewController as? CalculatorViewController
            secondOperationViewController!.delegate = self;
        }       
    }
    

    【讨论】:

    • 嗯。它应该适用于我连接的 ViewController。但是没有 segue 的 ViewController 怎么办?我想使用委托方法在 SecondOperationViewController(从 ContainerViewController 嵌入 segue)、firstOperationViewController 和 thirdOperationViewController(没有任何 segue)之间切换。
    • @Kenarius1 在这种情况下,您可以查看ViewControlleridentifiersecondOperationViewController.identifier == "secondOperationViewController"(根据您的第一个示例)。
    • 但是如何在没有 segue 的情况下实例化 ViewController?我应该尝试以编程方式创建一个segue吗?在 Objective-C 中,我使用了 'self.firstOperationViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"firstOperationViewController"]' 但似乎它不适用于 Swift 中的委托。
    • @Kenarius1 不就行了:self.firstOVC = OperationViewController()。您不需要使用故事板来实例化所有控制器。
    • 如果我用以下方法实例化 ViewController:'firstOperationViewController = CalculatorViewController(); firstOperationViewController.delegate = self' 然后我的委托方法不再起作用。所以我认为我需要 3 个属性,每个属性都用它自己的标识符进行实例化。问题在于,instantiateViewControllerWithIdentifier 在 Swift 中不能像在 Objective-C 中那样工作。
    猜你喜欢
    • 1970-01-01
    • 2016-04-06
    • 2014-03-18
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多