未调用委托 (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 在这种情况下,您可以查看ViewController
的identifier
。 secondOperationViewController.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)的主要内容,如果未能解决你的问题,请参考以下文章
UIDocumentPickerViewController - 未调用委托方法