未调用委托 (instantiateViewControllerWithIdentifier)

Posted

技术标签:

【中文标题】未调用委托 (instantiateViewControllerWithIdentifier)【英文标题】:Delegate not being called (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

【问题讨论】:

【参考方案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 中那样工作。

以上是关于未调用委托 (instantiateViewControllerWithIdentifier)的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 委托未调用

Swift 3委托函数未调用

UIDocumentPickerViewController - 未调用委托方法

UICollectionReusableView 中未调用委托

未调用委托方法

未调用 TableViewCell 内的 UIPickerView 委托