executeSegueWithIdentifier из TableViewController во второй TVC, встроенный в NavController, не работает - PullRequest
6 голосов
/ 24 декабря 2011

У меня есть два TableViewController с промежуточным переходом.Когда пользователь нажимает на ячейку в первом TVC, он получает второй TVC.Segue является модальным, имеет идентификатор «segueToLocationDetails» и передает объект вместе с ним.Вы можете более или менее думать о втором ТВЦ как о странице «подробностей».

Мой код отлично работает в сценарии, который я описал выше.Однако он ломается, как только я встраиваю второй TVC в контроллер навигации.

Пример.У меня это работает отлично.Затем я выделяю второй TVC в IB, наведите курсор мыши на Product |Вставить в |Навигационный контроллер.Теперь второй TVC находится в Nav Controller.Сегмент, однако, все еще указывает на второй ТВЦ.Я удаляю переход и снова подключаю его из первой ячейки TVC к навигационному контроллеру и обязательно даю идентификатор идентификатора.Запустите снова, и он сломается!Ошибка ниже ...

2011-12-23 15: 30: 45.469 Project12 [5219: 11603] - [UINavigationController setDetailsObject:]: нераспознанный селектор, отправленный экземпляру 0x7b92ce0 2011-12-2315: 30: 45.471 Project12 [5219: 11603] * Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [UINavigationController setDetailsObject:]: нераспознанный селектор, отправленный экземпляру 0x7b92ce0' * Первый стек вызова: (0x16ea052 0x150ad0a 0x16ebced 0x1650f00 0x1650ce2 0x3933 0x703e1e 0x36f6d9 0x36f952 0xbf786d 0x16be966 0x16be407 0x16217c0 0x1620db4 0x1620ccb 0x14ec879 0x14ec93e 0x2dfa9b 0x2a98 0x29f5 0x1) Terminate называется выбрасывания языка exceptionCurrent: автоматический;в настоящее время цель-c

Ниже приведен код, помогающий объяснить:

AllLocations.h & AllLocations.m (это главная таблица)

AllLocations.h

@interface AllLocations : UITableViewController
{
    SQLiteDB *mySQLiteDB;
}
@property (nonatomic, strong) NSMutableArray *locationsArray;



AllLocations.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"segueToLocationDetails" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueToLocationDetails"]) 
    {
        NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
        NSInteger rowNumber = selectedIndexPath.row;

        mySQLiteDB = (SQLiteDB *) [locationsArray objectAtIndex:rowNumber];

        DetailsTVC *detailsTVC = [segue destinationViewController];

        detailsTVC.detailsObject = mySQLiteDB;        
    }
}

DetailsTVC.h & DetailsTVC.m (это подробное представление таблицы)

DetailsTVC.h

@interface DetailsTVC : UITableViewController

@property (nonatomic, strong) SQLiteDB *detailsObject;


DetailsTVC.m

@implementation SpotDetailsTVC

@synthesize spotDetailsObject;

Примечание. Я пропустил весь код, который был не очень важен или не имеет отношения к вопросу.

Опять же: это прекрасно работает, если переход идет от Originating TableVeiwController к другому TableViewController.Это ломается только когда я встраиваю второй TVC в Nav Controller.Мне нужно знать, как заставить это работать с Nav Controller на картинке.Заранее спасибо!

1 Ответ

11 голосов
/ 24 декабря 2011

DetailsTVC *detailsTVC = [segue destinationViewController];

Эта строка неверна. Поскольку ваш второй TVC теперь встроен в контроллер навигации, [segue destinationViewController] теперь является UINavigationController. Это должно работать:

DetailsTVC *detailsTVC = [[segue destinationViewController] visibleViewController];

...