Почему ViewController не объявляет, когда он содержит NavigationController при нажатии segue?

#ios #objective-c #cocoa-touch #segue

#iOS #objective-c #cocoa-touch #segue

Вопрос:

Я просто хочу, чтобы segue передавал что-то моему SecondViewController, но этого «нет» в моем коде. Я получаю сообщение об ошибке «использование неопознанного идентификатора SecondViewController», но я импортировал соответствующий файл .h.
Я попробовал несколько различных комбинаций попыток явного объявления этого, но ничего не работает.
Каков правильный способ сделать это — чего мне не хватает!
В моем SecondViewController встроен NavigationControllerEmbedded, поэтому переход от FirstViewController к SecondViewController кажется ужасно сложным для относительно простого процесса.

Код:
FirstViewController.h

 (Should there be something here?)
  

FirstViewController.m

 #import "FirstViewController.h"
#import "SecondViewController.h" 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"123"]) {
        UINavigationController *navController = [segue destinationViewController];
        SecondViewController *BVC = (SecondViewController *)([navController viewControllers][0]); 
  

Я получаю ошибку в приведенной выше строке.

 BVC.ATitle = @"SomeText"
BVC.AImg = [UIImage imageNamed:@"SomePicture.jpg"];
    }
}
  

SecondViewController.h

 @property (strong, nonatomic) IBOutlet UILabel *ALabel;
@property (strong, nonatomic) IBOutlet UIImageView *AImageView;

@property (strong, nonatomic) UIImage *AImg;
@property (strong, nonatomic) NSString *ATitle;
  

SecondViewController.m

 #import "FirstViewController.h"
#import "SecondViewController.h" 

@implementation ButtonViewController
@synthesize ALabel;
@synthesize AImageView;

- (void)viewDidLoad
{
    self.ALabel.text = self.ATitle;
    self.AImageView.image = self.AImg;
}
  

Редактировать: Но я явно пропускаю объявление SecondViewController где-либо в моем коде, иначе почему бы его даже не было в приглашении, когда я начинаю пытаться ввести его. Даже если я попробую это без NavController все вместе, это все равно выдает ошибку неопознанного идентификатора.

Комментарии:

1. Ваш первый контроллер просмотра встроен в контроллер навигации? Или только второй?

2. @Paulw11 Нет, первого контроллера просмотра нет, только второй.

3. Тогда я не думаю, что вы можете использовать push-segue от 1 до 2, но независимо от этого вы должны установить точку останова в prepareForSegue и изучить NavController, чтобы увидеть, что это за объект. Я подозреваю, что вы можете обнаружить, что это ссылка на SecondViewController

Ответ №1:

Используйте navigationController.topViewController вместо navigationController.viewControllers[0] .

Попробуйте удалить файлы второго view controller из Xcode (не перемещая их в корзину), а затем повторно добавить их. Кроме того, очистите проект перед повторной компиляцией.

Еще одна проблема с вашим кодом заключается в том, что вы не соблюдаете соглашение об использовании имен переменных в camelCase, начинающихся с маленькой буквы. Хотя это не должно иметь значения для компиляции, это делает ваш код менее читаемым.

Комментарии:

1. вместо чего именно?

2. Я изложил это по буквам — извините, я думал, это очевидно. Это также должно решить вопрос (поскольку проблема, вероятно, связана с приведением).

3. @Mundi Ура! Удаление и чтение исправили это. Вероятно, следовало попробовать это раньше. Новое это было бы просто. И все же, почему это должно происходить случайным образом?