在UIViewController的prepareForSegue中访问属性

10

我对Objective-C相对较新,之前有Java开发经验,因此指针和编译错误的概念让我感到有些困惑。

我有一个实现了代理(jsonControllerDidLinkedInAuth方法)的类。每当委托者向该类发送消息时,将自身和(NSURL*)url传递给该类,我试图将url赋值给属性authUrl,并在该操作完成后调用performSegueWithIdentifier,进而执行prepareForSegue (就我对此的理解而言)。

然而这似乎不起作用,因为我收到了以下这个SIGABRT终止应用程序的错误消息:

App[3278: 13517] * Terminating app due to uncaught exception 'NSInvalidArgumentException',reason:'-[UINavigationController setUrlAddress:]:在0x6acab00实例中未识别选择器发送'

这两个方法都位于同一类中,该类是一个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吗?我尝试进行类型转换(casting),但会收到一条消息,告知我不能对指针进行强制类型转换。
任何帮助将不胜感激。谢谢阅读。
编辑1:在setUrlAddress上方的NSLog确实返回了self.authUrl。我认为这可能是某种可见性问题,但我不确定如何解决。
2个回答

21

如果你的视图控制器嵌入了 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];
        }
}

如果你有多个segue过渡到一个嵌入在UINavigationController中的视图控制器,我通常会在prepareForSegue:sender的开头添加以下代码:

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

现在vc包含了你实际感兴趣的视图控制器,这样你就不必为每个转场复制和粘贴强制类型转换。


谢谢你,这个完美运行!而且你的信息让我节省了很多调试时间,因为还有几个其他的视图控制器会以类似的方式运作。 - Daniel Z.
不用客气。请查看我的更新答案,有一种简单的方法可以访问您感兴趣的视图控制器,而无需每次都进行强制转换。 - Scott Berrevoets

0

看起来你没有分配委托,这是委托模式工作所必需的。尝试在你的prepareForSegue中添加vc.delegate = self


委托在另一个启动身份验证的方法中被分配,然后代理(未在我的代码片段中显示)调用了jsonControllerDidLinkedInAuth:,但无论如何还是谢谢 :) 我的问题与我的ViewController嵌入在NavigationController中有关,正如Scott所指出的那样。 - Daniel Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接