我是Objective-C的新手,我来自Java背景,因此我发现指针的概念而不是 - 那很好地解释了编译错误相当令人生畏。
我有一个使用jsonControllerDidLinkedInAuth方法实现委托的类。每当委托人向此类发送消息,传递自身和(NSURL *)网址时,我正在尝试将网址分配给属性 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。我假设它必须是某种可见性问题,但我不知道如何解决这个问题。
答案 0 :(得分: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];
}
}
如果你有超过1个segue转换到嵌入在UINavigationController中的视图控制器,我通常会将其添加到prepareForSegue:sender
的开头:
if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]
现在vc
包含您真正感兴趣的视图控制器,因此您不必为每个segue复制和粘贴转换。
答案 1 :(得分:0)
看起来您不是要分配委托,您需要这样才能使委托模式起作用。尝试将vc.delegate = self
添加到prepareForSegue。