В UITableView для отправки на контроллер детального представления, что бы я ни делал, prepareForSegue не может получить выбранную строку. Я пытался:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

Но это ноль. Я пытался:

 NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

Дело в том, что отправитель выходит, как я вижу из журнала:

 Sender is <ARASpecialCell: 0x75cd6d0; baseClass = UITableViewCell; frame = (0 44; 320 44); text = 'Late Night'; autoresize = W; layer = <CALayer: 0x75c98c0>>

Специальная ячейка возникла из-за того, что я попытался создать подкласс ячейки и добавить общедоступное свойство, но у меня возникли проблемы с доступом к нему.

Я попытался просто получить текстовую метку и использовать ее, но возникла ошибка:

 "property "textlabel" not found on object of type '__strong id'"

Я попробовал «выбранную строку в индексном пути», чтобы загрузить следующий контроллер представления, но контроллер подробного представления настроен из другого на раскадровке, и было бы беспорядочно перенастраивать.

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

0
mike s 13 Мар 2013 в 10:44

1 ответ

Лучший ответ

Вам нужно @property в вашем контроллере, где вы сохраните выбранный элемент. Например, вы выбираете ячейку и в didSelectCellAtIndexPath сохраняете соответствующий объект данных в свойстве selectedItem. Затем вы должны вызвать segue, который вы создали в конструкторе интерфейсов.

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     self.selectedItem = [self.fetchedResultsController objectAtIndexPath:indexPath];
     [self performSegueWithIdentifier:@"Item Details Segue" sender:self];
}

А затем в вашем performSegueWithIdentifier вы можете делать все, что хотите, с вашим selectedItem:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     if ([segue.identifier isEqualToString:@"News Details Segue"])
    {
        NewController *controller = segue.destinationViewController;
        NewController.item = self.selectedItem;
    }
}
0
surfrider 13 Мар 2013 в 12:08
Большое спасибо. Я делал как минимум две ошибки:
 – 
mike s
14 Мар 2013 в 05:26
(несколько комментариев непреднамеренно) 1) Первая, тупая ошибка заключалась в том, что я настолько увяз в конфликте при нажатии нового контроллера представления в didSelectARowAtIndexPath, что забыл, что все еще необходимо вызвать его, чтобы получить путь индекса . 2) Возможно, я допустил ошибку 1, потому что didSelectARow... не был вызван, потому что я подключил segue непосредственно к ячейке табличного представления. Я вижу в этом определенные преимущества: создание полностью настраиваемого меню с табличным представлением не было интуитивно понятным. Крепление к столу зафиксировало.
 – 
mike s
14 Мар 2013 в 05:33