Замена Storyboard Segue на pushViewController вызывает странное поведение - PullRequest
0 голосов
/ 02 марта 2012

Я не могу понять это для моей жизни. У меня есть пользовательская ячейка табличного представления, в этой ячейке у меня настроено несколько кнопок. Каждая кнопка соединяется с другими контроллерами представления через сеанс раскадровки. Я недавно удалил эти сегменты и установил метод pushViewController. Переход назад и вперед по различным представлениям работает, как ожидалось, однако контроллер представления назначения ничего не отображает! У меня есть код ниже в качестве примера.

Для кнопок установлен этот метод:

[cell.spotButton1 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside];
// etc...
[cell.spotButton4 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside];
// etc...

Метод showSpotDetails содержит этот код:

- (void)showSpotDetails:(id)sender
{
    // determine which button (spot) was selected, then use its tag parameter to determine the spot.
    UIButton *selectedButton = (UIButton *)sender;
    Spot *spot = (Spot *)[spotsArray_ objectAtIndex:selectedButton.tag];

    SpotDetails *spotDetails = [[SpotDetails alloc] init];
    [spotDetails setSpotDetailsObject:spot];
    [self.navigationController pushViewController:spotDetails animated:YES];
}

Подробности VC получает данные объекта.

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"spotDetailsObject %@", spotDetailsObject_.name);
}

Метод NSLog ниже выводит переданный объект. Кроме того, все в контроллере представления деталей, как было. Ничего не изменилось в деталях ВК. Он просто ничего не рендерит с тех пор, как я удалил переход и добавил метод pushViewController. Возможно, мне что-то не хватает в методе pushViewController? Я никогда так не поступаю, стараюсь всегда использовать сегы ...

Есть предложения?

1 Ответ

3 голосов
/ 02 марта 2012

Добро пожаловать в реальный мир. Раньше раскадровка была опорой; Вы скрывали от себя правдивые факты о том, как работают контроллеры представления. Теперь вы пытаетесь выбросить этот костыль. Хорошо! Но теперь ты должен научиться ходить. :) Ключом здесь является эта строка:

SpotDetails *spotDetails = [[SpotDetails alloc] init];

SpotDetails является подклассом UIViewController. Вы не делаете здесь ничего, что могло бы заставить этот UIViewController иметь представление. Таким образом, вы получаете пустой общий вид! Если вы хотите UIViewController иметь вид, что вам нужно дать это вид как-то. Например, вы можете нарисовать представление в наконечнике SpotDetails.xib, где владельцем файла является экземпляр SpotDetails. Или вы можете создать содержимое представления в коде в переопределении viewDidLoad. Подробности в документации UIViewController, или, еще лучше, читать мою книгу, которая расскажет вам все о том, как контроллер представления получает свое мнение:

http://www.apeth.com/iOSBook/ch19.html

Причина эта проблема не возникает до того, что вы нарисовали вид в том же кончике пера, как контроллер представления (т.е. файла раскадровка). Но когда вы Alloc-INIT а SpotDetails, то есть не тот же экземпляр в качестве одного в файле раскадровки, так что вы не получите эту точку зрения. Таким образом, одним из решений может быть, чтобы загрузить раскадровку и принести , что SpotDetails Например, один в раскадровке (путем вызова instantiateViewControllerWithIdentifier:). Я объясню, как сделать это здесь:

http://www.apeth.com/iOSBook/ch19.html#SECsivc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...