我对Objective-C相对较新,并且来自Java背景,因此我发现指针的概念和解释不充分的编译错误相当令人生畏。
我有一个使用jsonControllerDidLinkedInAuth方法实现委托(delegate)的类。每当委托(delegate)者向此类发送消息时,传递其自身和(NSURL *)url,我将尝试将 url 分配给属性 authUrl ,此操作完成时调用performSegueWithIdentifier,该方法依次执行prepareForSegue(就我对此的理解而言)。
这似乎不起作用,因为我收到了:
错误消息,使用 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。我假设这一定是某种可见性问题,但是我不确定如何解决此问题。
最佳答案
如果您的 View Controller 嵌入在UINavigationController中,则segue.destinationViewController
引用该导航 Controller 。这是您可以使用的:
- (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中的 View Controller ,则通常将其添加到
prepareForSegue:sender
的开头:if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]
现在
vc
包含了您实际上感兴趣的 View Controller ,因此您不必为每个序列复制和粘贴内容。