Ответ 1
Я думаю, вы сделали это слишком сложно. Не беспокойтесь, я делаю то же самое часто.
Во-первых, отправив tableView:didSelectRowAtIndexPath:
из tableView:accessoryButtonTappedForRowAtIndexPath:
, нет никакой разницы между этими двумя методами. Нажатие на ячейку или ее вспомогательная кнопка выполняет одно и то же действие. Если вам не нужна кнопка аксессуара для выполнения другого действия, кроме нажатия самой ячейки, удалите ее.
Во-вторых, если вы используете раскадровку, вам не нужно выделять /initWithNib для ваших контроллеров представлений. Вместо этого используйте segue. Если вы делаете это через раскадровку, вам также не нужно программно нажимать viewControllers на ваш navigationController
Сначала создайте раскадровку:
- Вытащите UITableViewController. Убедитесь, что вы установили класс UITableViewController, который вы перетащили на свой собственный "DetailViewController", используя панель инспектора с правой стороны.
- Затем выберите этот контроллер и с помощью меню выберите " Редактор → Вставить → Контроллер навигации".
- Затем перетащите три общих UIViewControllers. Установите класс один в "LatteViewController", другой - "EspressoViewController", а третий - "CapicinoViewController" (снова с помощью инспектора).
- Управляйте + перетаскиванием из UITableViewController на каждый из этих viewControllers и выберите PUSH.
- Нажмите на маленький круг, который находится на стрелке между вашим UITableViewController и каждым из этих viewControllers. В инспекторе (справа) дайте каждому segue уникальное имя в поле Идентификатор. Вам нужно будет запомнить это имя для своего кода. Я бы назвал их "EspressoSegue", "LatteSegue" и "CapicinoSegue". Вы увидите, почему в коде ниже.
Затем поместите следующий код в свой UITableViewController:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
//Build a segue string based on the selected cell
NSString *segueString = [NSString stringWithFormat:@"%@Segue",
[contentArray objectAtIndex:indexPath.row]];
//Since contentArray is an array of strings, we can use it to build a unique
//identifier for each segue.
//Perform a segue.
[self performSegueWithIdentifier:segueString
sender:[contentArray objectAtIndex:indexPath.row]];
}
Как вы реализуете все остальное зависит от вас. Вы можете реализовать prepareForSegue:sender:
в своем UITableViewController, а затем использовать этот метод для отправки информации на segue.destinationViewController
.
Обратите внимание, что я передал строку из вашего contentArray в качестве отправителя для segue. Вы можете передать все, что захотите. Строка, которая идентифицирует ячейку, кажется, что наиболее логичная информация проходит, но выбор зависит от вас.
Приведенный выше код должен выполнить навигацию для вас.