Последовательный запуск, но не нажатие / UITabBarController / UITableViewController при нажатии на ячейку - PullRequest
4 голосов
/ 08 января 2012

Должно быть простое решение, но после 4 часов просмотра StackExchange я сдаюсь и пытаюсь получить ответ здесь:

Ситуация: iOS 5, Xcode 4.2.1, используяРаскадровки

Настройка:

  • Root Navigation Controller = UITabBarController с 5 элементами
  • Каждая вкладка связана с UITableViewController (через сегменты), который работает отлично, автоматически
  • У меня есть классы для каждого контроллера представления и контроллера навигации (UITabBarController)
  • Я нажимаю на вкладку, скажем «Программа», и она показывает мне список элементов (в связанном UITableViewController),скажем, один из этих элементов "Sessions"
  • Я нажимаю на "Sessions", didSelectRowAtIndexPath вызывается просто отлично.
  • Я хочу выполнить переход сейчас (который я подключил из этого UITableViewController,не ячейку, новому UITableViewController и присвоенному ему идентификатору.
  • Я звоню: [self performSegueWithIdentifier:@"programToSessions" sender:self];

  • prepareForSegue получает called, но ничего потом.Нет ошибок, нет предупреждений.Новый UITableViewController не отображается.

  • Примечание. Однако он обнаруживается, если я переключаю переход на «модальный» - но он отбрасывает / скрывает исходную панель вкладок внизу.тогда (не предназначено ...)

До сих пор моя проблема, казалось, имела вероятное решение.Контроллер навигации.Я подумал, что если я установлю ссылку на контроллер навигации в AppDelegate, инициализирую / установлю его после загрузки фактического корневого контроллера навигации (в viewDidLoad), то есть в основном использовал что-то вроде: app.navController = self.navigationController в viewDidLoad - это может сработать!Правильно?Итак, я изменил действие segue на: [app.navController performSegueWithIdentifier:@"programToSessions" sender:self];

Пока ничего не меняется, оно не отображается.

Есть идеи?

Решено:

Здесь было несколько проблем.Основная проблема заключалась в том, что я пропустил установку «контроллера навигации» между UITabBarController и UITableViewController.Это можно сделать, добавив новый «Navigation Controller» в раскадровку, затем перетащите его из UITabBarController (rootViewController) в этот новый контроллер и установите RELATIONSHIP.Затем перетащите ОТНОШЕНИЕ в UITableViewController.Таким образом, как указано в правильном ответе, он должен выглядеть следующим образом: UITabBarController -> (отношение) -> UINavigationController -> (отношение) -> UITableViewController

Для загрузки новых UITableViewController поверхПоследний UITableViewController, простой переход и вызов его через код будет достаточно.Конечное дерево будет выглядеть так:

UITabBarController -> (отношение) -> UINavigationController -> (отношение) -> UITableViewController -> (переход) -> UITableViewController

Дайте seue идентификатор.В коде используйте это:

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

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Вы должны использовать prepareForSegue:sender:, чтобы получить эквивалент didSelectRowAtIndexPath:.(Очистите последний.) Вместо того, чтобы помещать новый контроллер представления в стек навигации, у segue уже есть свойство destinationViewController, которое будет просто работать автоматически.Вы можете изменить это свойство, если хотите настроить новый контроллер представления.Убедитесь, что segue.identifier правильно!

Кроме того, из вашего вопроса я заметил некоторую путаницу в отношении контроллеров контроллеров представления.Вы упомянули два из них: контроллер панели вкладок и контроллер навигации.В раскадровке настройка должна быть такой:

TabBarController --(relationship)--> NavigationController 
--(relationship)--> ViewController 
--(segue)--> next ViewController

Убедитесь, что все это правильно в раскадровке, и посмотрите, работает ли она.

1 голос
/ 09 февраля 2012

Вам не нужно performSegue программно.Вы можете создать переход от первого UITableViewController ко второму на раскадровке, управляя перетаскиванием элемента управления из UITableViewCell первого UITableViewController во второй UITableViewController.Если переход не выполняется, его наиболее вероятная причина состоит в том, что идентификатор ячейки в методе

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

и в «Инспекторе атрибутов» не совпадают.

Для передачи данных изпервый UITableViewController ко второму добавляет следующий метод к первому:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"loadMyDetailView"]) {
        MyDetailViewController *detailVC = [segue destinationViewController];
        NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
        detailVC.dataToPass = [self getDataToPass:selectedRowIndex.row];
    }

}
...