【问题标题】:Accessing property in the prepareForSegue of a UIViewController访问 UIViewController 的 prepareForSegue 中的属性
【发布时间】:2012-07-01 07:44:59
【问题描述】:

我对 Objective-C 比较陌生,而且我来自 Java 背景,因此我发现指针的概念和不能很好解释的编译错误非常令人生畏。

我有一个使用 jsonControllerDidLinkedInAuth 方法实现委托的类。每当 delegator 向此类发送消息,传递自身和 (NSURL *)url 时,我试图将 url 分配给属性 authUrl,当此操作完成时调用 performSegueWithIdentifier,后者又执行 prepareForSegue(据我对此的理解)。

这似乎不起作用,因为我收到了一个:

App[3278:13517] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UINavigationController setUrlAddress:]:无法识别的选择器发送到实例 0x6acab00”

使用 SIGABRT 终止应用程序的错误消息。

这两个方法都驻留在同一个类中,这是一个 UINavigationController 并指向另一个 UINavigationController。编译器将我指向第二种方法的[vc setUrlAddress:self.authUrl];

- (void)jsonControllerDidLinkedInAuth:(JsonController *)controller :(NSURL *)url {
    authUrl = url;
    if (authUrl != nil) {
        [self performSegueWithIdentifier:@"LinkedInAuth" sender:self];
    } else {
        NSLog(@"Auth URL is null");
    }
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) {
        // Get destination view
        LinkedInViewController *vc = [segue destinationViewController];
        NSLog(@"The auth url from prepareForSegue in SignupViewControlle: %@", self.authUrl);
        [vc setUrlAddress:self.authUrl];
    }
}

问题似乎是由于某种原因我无法访问我当前所在类的 authUrl 属性。我尝试使用 authUrl、[self authUrl] 和 self.authUrl,但这些似乎都不起作用。 属性是合成的,但我也注意到了一个小提示:“UINavigationController setUrlAddress”,这不应该是上面方法中定义的LinkedInViewController吗?我尝试投射 (LinkedInViewController)[segue destinationViewController],但随后我收到一条消息,通知我您无法投射到指针上。

任何帮助将不胜感激。感谢阅读。

编辑 1:setUrlAddress 上方的 NSLog 确实返回 self.authUrl。我假设它一定是某种可见性问题,但我不确定如何解决这个问题。

【问题讨论】:

    标签: objective-c ios5 xcode4.3


    【解决方案1】:

    如果您的视图控制器嵌入在 UINavigationController 中,segue.destinationViewController 指的是该导航控制器。这是你可以使用的:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
            if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) {
                UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController;
                LinkedInViewController *linkedInViewController = [[navigationController viewControllers] lastObject];
                linkedInViewController setUrlAddress:self.authUrl];
            }
    }
    

    如果你有超过 1 个过渡到嵌入在 UINavigationController 中的视图控制器的 segue,我通常会将其添加到 prepareForSegue:sender 的开头:

    if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
            id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]
    

    现在vc 包含您真正感兴趣的视图控制器,因此您不必为每个segue 复制和粘贴转换。

    【讨论】:

    • 谢谢,这就像一个魅力!此外,您的消息为我节省了很多调试时间,因为几乎没有其他 ViewController 会以类似的方式运行。
    • 不客气。请参阅我更新的答案,以轻松访问您感兴趣的视图控制器,而无需每次都进行强制转换。
    【解决方案2】:

    您似乎没有分配委托,您需要这样做才能使委托模式起作用。尝试将 vc.delegate = self 添加到您的 prepareForSegue。

    【讨论】:

    • 委托是在另一个启动身份验证的方法中分配的,然后委托(未在我的代码 sn-ps 中显示)调用 jsonControllerDidLinkedInAuth:,但无论如何谢谢你 :) 我的问题与正如 Scott 所指出的,我的 ViewController 嵌入在 NavigationController 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多