Доступ к собственности в файле readyForSue UIViewController
Я относительно новичок в Objective-C, и я исхожу из фона Java, поэтому я нахожу понятие указателей и не очень хорошо объясненных ошибок компиляции довольно сложным.
У меня есть класс, который реализует делегат с помощью метода jsonControllerDidLinkedInAuth. Всякий раз, когда делегировать отправляет сообщение этому классу, передавая сам и URL (NSURL *), я пытаюсь присвоить url свойство authUrl, когда эти операции заканчиваются, вызовите функцию performSegueWithIdentifier, которая, в свою очередь, выполняет команду prepareForSegue (насколько я понимаю это).
Это не работает, поскольку я получаю:
Приложение [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 класса I, который я сейчас являюсь. Я пробовал с authUrl, [self authUrl] и self.authUrl, но ничто из этого не похоже на работу.
Свойства синтезируются, но я также заметил небольшой намек: "UINavigationController setUrlAddress", не должен ли это быть LinkedInViewController, как определено выше в методе? Я попробовал кастинг (LinkedInViewController) [segue destinationViewController], но потом я получил сообщение, уведомляющее меня о том, что вы не можете наложить указатель.
Любая помощь будет высоко оценена. Спасибо за чтение.
Изменить 1: NSLog чуть выше setUrlAddress возвращает self.authUrl. Я предполагаю, что это должна быть какая-то проблема видимости, но я не уверен, как это решить.
Ответы
Ответ 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 segue, который переходит к контроллеру представления, встроенному в UINavigationController, я обычно добавляю его в начало prepareForSegue:sender
:
if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]])
id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject]
Теперь vc
содержит контроллер просмотра, на который вы действительно заинтересованы, поэтому вам не нужно копировать и вставлять кастинг для каждого сеанса.
Ответ 2
Не похоже, что вы назначаете делегата, что вам нужно сделать, чтобы шаблон делегата работал. Попытайтесь добавить vc.delegate = self
к вашей готовой форме.