Доступ к собственности в файле 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 к вашей готовой форме.