Использовать метод didSelectRowAtIndexPath или prepareForSegue для UITableView?

Я использую раскадровки, и у меня есть UITableView. У меня есть настройка segue, которая выталкивает из моей таблицы в деталь VC. Но какой метод я должен использовать для этого? Мне придется передать пару объектов в подробный вид. Но я использую didSelectRowAtIndex или -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender ?

Если вы используете prepareForSegue:sender: тогда у вас не будет столько изменений, если вы позже решите вызвать segue из какого-то элемента управления вне представления таблицы.

Сообщение prepareForSegue:sender: сообщение отправляется текущему controllerу, поэтому я бы предложил следующее:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Assume self.view is the table view NSIndexPath *path = [self.tableView indexPathForSelectedRow]; DetailObject *detail = [self detailForIndexPath:path]; [segue.destinationViewController setDetail:detail]; } 

В Свифт:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let path = self.tableView.indexPathForSelectedRow()! segue.destinationViewController.detail = self.detailForIndexPath(path) } 

Я сделал это, и это сработало

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"Row Selected = %i",indexPath.row); [self performSegueWithIdentifier:@"testID" sender:self.view]; } 

Когда отправителем является UITableViewCell, вы можете запросить UITableView запрос indexPath ячейки.

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let cell = sender as? UITableViewCell { let indexPath = self.tableView.indexPathForCell(cell)! assert(segue.destinationViewController.isKindOfClass(DetailViewController)) let detailViewController = segue.destinationViewController as! DetailViewController detailViewController.item = self.items[indexPath.row] // like this } } 

если ваше свойство tableView находится в другом classе, и у вас есть только один раздел , то вы можете использовать свойство tag для хранения строки ячейки, например:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.tag = indexPath.row; return cell; } 

И тогда вы можете получить к нему доступ, поскольку sender является той же ячейкой со значением строки в своем теге:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { MyDestinationViewController *destinationViewController = segue.destinationViewController; destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell } 

Если ячейка отправителя не self.tableView.indexPathForSelectedRow выбрана, self.tableView.indexPathForSelectedRow возвращает выбранную ячейку, но не ячейку отправителя. Лучший способ получить indexPath для отправителя segue:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; } 

В Свифт:

 override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) { (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) } 

Если вы используете prepareForSegue: вы можете проверить, кто является отправителем, и выполнить другой код

Например, в быстрой

 override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?) { var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell) if senderIsTableviewCell { //do something } } 
Interesting Posts

app.config для библиотеки classов

Поиск всех символических и жестких ссылок на файл в UNIX

Ограничение размера файла в Paint.NET

Отчеты в SOA (Business Intelligence & Service Oriented Architecture)

Удалите пароль пользователя, используя команду "net"

Как установить расширенные свойства файла?

Создание одного большого непрерывного пространства из 4 дисков

«Распаковка» кортежа для вызова соответствующего указателя функции

Как я могу выровнять меню / значки панели инструментов Android слева, как в приложении «Карты Google»?

Android 4.4.2 – java.lang.RuntimeException: выполнение остановки активности, которая не возобновляется

Какой код ответа HTTP-статуса я должен использовать, если в запросе отсутствует требуемый параметр?

Есть ли опция / функция MySQL для отслеживания истории изменений записей?

Как распечатать содержимое RDD?

Солить свой пароль: лучшие практики?

Объект Bound и unbound method в Python

Давайте будем гением компьютера.