【问题标题】:set navigationController's rootViewController as delegate将 navigationController 的 rootViewController 设置为委托
【发布时间】:2012-12-27 07:29:57
【问题描述】:

我的问题可能是一种技术,而不是对如何设置控制器和委托的误解。也就是说,也许我应该采取不同的方式......

无论如何,我有一个带有 mainViewController 的情节提要设置。其中有一个UIButton,单击它时会转到一个弹出窗口。弹出框的内容视图控制器是UINavigationController,而rootViewController 是MyViewController。

我正在尝试将mainViewController 设为delegate 的MyViewController,并在prepareForSegue 中这样做:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:(@"popSleepSegue")] || [segue.identifier isEqualToString:(@"popAlarmSegue")])
    {
        UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue;
        popSegue.popoverController.delegate = self;
        popSegue.popoverController.passthroughViews = [NSArray arrayWithObject:self.view];
        if ([segue.identifier isEqualToString:@"popAlarmSegue"])
        {
            if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]])
            {
                UINavigationController *uNC = (UINavigationController *)[segue destinationViewController];
                MyViewController *aVC = (MyViewController *)uNC.topViewController;
                aVC.popController = popSegue.popoverController;
                aVC.delegate = self;
            }
        }
    }
}

当MyViewController 加载时,[self.delegate class] 在NSLog 中以null 的形式出现。当然,delegate 回调不会在 mainViewController 中收到。

基本上,我是在尝试模仿 Apple 日历应用在 iPad 上的行为。

我正在尝试使用委托按照习语向上游传递数据。诀窍是我试图通过UINavigationController 设置delegate,这是一个弹出框的内容视图。听起来太复杂了。也许还有其他成语?

同时,我要试一试 NSNotificationCenter。

【问题讨论】:

  • 奇怪的是,当我在这里得到null 时:[self.delegate class] 在 MyViewController 的 viewDidLoad 中实际上触发了回调。奇怪。
  • 我刚刚在 MyViewController 中创建了一个测试变量:@property (nonatomic, strong) NSString *testString; 并试图在 segue 中设置它并在 MyViewController 的视图中打印出来确实加载了。没用。我的猜测是 MyViewController 在 segue 时不存在 - UINavigationController(即目标视图控制器)是唯一存在的。嗯。
  • 天哪 - 如果我在调用委托协议之前将 [self.delegate 类](和 testString)的 NSLog 打印输出从 viewDidLoad 移动到右侧,那么它们确实打印正确,显示委托(和 testString)确实是在 prepareForSegue 中设置的。有任何想法吗? @properties 直到 viewDidLoad 之后才设置吗?

标签: objective-c ios delegates uinavigationcontroller


【解决方案1】:

你必须有可能的“如果”陈述是不正确的:

if ([segue.identifier isEqualToString:@"popAlarmSegue"])
        {
            if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]])
            {

从您的代码的外观来看,您应该在 PopOver 的内容控制器中钻取控制器,而不是从 segue 中获取目标 viewController。看来第二个“如果”不正确。

您需要添加:

            if ([[popSegue.popoverController contentViewController] isKindOfClass:[UINavigationController class]])
            {
                UINavigationController *uNC = (UINavigationController *)popSegue.popoverController;
                MyViewController *aVC = (MyViewController *)uNC.topViewController;
                aVC.popController = popSegue.popoverController;
                aVC.delegate = self;
            }

【讨论】:

  • 为什么这两个'if'语句都不正确?一个是在谈论 segue 的标识符,而另一个是在谈论目标视图控制器的类?这是两个不同的东西。仅供参考,事实上,我不需要第二个,因为我知道它必须是 UINavigationController 但我正在检查是否彻底。
  • 我应该提到,如果我使用您的代码或我的代码,我会得到相同的结果。我看到了使用 contentViewController 背后的逻辑,但由于某种原因,它并没有改变任何东西。
  • 另外,如果您查看我的 cmets 问题,如果我等到 viewDidLoad 在 NSLogging 之前完成,我会得到预期的结果。
  • 通过使用断点,代码是否到达了最里面的if?我想是的,那么您需要查看“aVC”指针值(十六进制)是否与 MyController 的 viewDidLoad 中的“self”相同。我只看到委托设置在不同的控制器中。回调的顺序是 prepareForSegue -> ViewDidLoad -> ViewWillAppear -> ...
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多