4

Там должна быть простым решением этой проблемы, но после 4 часов просмотра StackExchange, я сдаюсь и пытается получить это ответило здесь:Segue стрельба, но не толкая/UITabBarController/UITableViewController когда клетка щелкнула

ситуации : IOS 5, Xcode 4.2.1, с помощью раскадровки

Установка:

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

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

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

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

Однако ничего не меняется, оно не появляется.

Любые идеи?

Решено:

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

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

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

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

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

Ваше решение работал для меня. Вы должны опубликовать его в качестве ответа, чтобы люди могли проголосовать за него –

ответ

3

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

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

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

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

+0

эй Мунди, спасибо за ваш очень быстрый ответ. Я пробовал следовать вашим советам, но не стал бы дальше. Я удалил 'didSelectRowAtIndexPath' - и перетащил segue из UITableViewController в следующий UITableViewController. Я также добавил небольшой код отладки в 'prepareForSegue', но он не вызывается, если я не называю его программным. Поэтому я попытался перетащить segue из ячейки UITableViewController в конечный UITableViewController (тот, который никогда не появляется) и снова запускал его. Не получится. Stuck ... –

+0

вот что выглядит раскадровка (обратите внимание на три связанных экрана, это те, которые имеют значение) http://imgur.com/fEGNF - «Навигация контроллера» загружает каждый из UITableViewControllers просто отлично - и У меня есть код в «Программе контроллера», чтобы показать 1 строку. Если я коснусь этого, я бы хотел выполнить еще один сеанс и показать «Сеансы контроллера». Я удалил код сейчас, только это в «Программе контроллера»: '- (void) prepareForSegue: (UIStoryboardSegue *) segue отправитель: (id) отправитель { NSLog (@" controllerProgram :: prepareForSegue:% @ ", segue.identifier); 'и он не срабатывает –

+0

В соответствии с изображением ** вы не выполнили настройку, как описано ** в моем ответе. Самый левый контроллер - это контроллер панели вкладок, следующий должен быть навигационным контроллером (которого вам не хватает), а затем «программным» контроллером. – Mundi

1

Программировать необязательно performSegue. Вы можете создать segue из первого 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]; 
    } 

} 
Смежные вопросы