Я установил точку останова на исключение и получал ошибку unrecognized selector sent to instance, экземпляр был самим UITableViewCell. Приложение использует CoreData, и когда UITextfield завершит редактирование, я хочу сохранить текст в NSManagedObject.

Вот метод textFieldDidEndEditing в моем TableViewController:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    MCSwipeTableViewCell *cell = (MCSwipeTableViewCell *) textField.superview.superview;
    TehdaItem *item = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForCell:cell]];


    item.itemTitle = cell.itemLabel.text; //The exception gets thrown on this line
// itemLabel is a UITextField and itemTitle is a string attribute of TehdaItem the NSManagedObject

    NSError *error;
    [item.managedObjectContext save:&error];

    if (![self.fetchedResultsController performFetch:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

}

<UITextFieldDelegate> установлен как мой TableViewController, и я установил его как делегата для UITextField. Не могу понять, в чем проблема.

РЕДАКТИРОВАТЬ: Удаление последнего вызова superview в MCSwipeTableViewCell *cell = (MCSwipeTableViewCell *) textField.superview.superview; решило проблему.

1
user2175433 16 Мар 2013 в 00:43
Пожалуйста, покажите нам полное сообщение об ошибке и укажите строку, в которой она была добавлена. В этом сообщении есть имя рассматриваемого метода / селектора.
 – 
Hermann Klecker
16 Мар 2013 в 00:45
Извините, вы отметили линию. Если это действительно UITableViewCell, возникает проблема, потому что это должен был быть MCSwipeTableViewCell. UITableViewCell не может ответить на itemLabel. Опять же, покажите полное сообщение об ошибке.
 – 
Hermann Klecker
16 Мар 2013 в 00:47
Вот сообщение об ошибке -[UITableView itemLabel]: unrecognized selector sent to instance 0x8828c00 экземпляр cell = (MCSwipeTableViewCell.
 – 
user2175433
16 Мар 2013 в 00:51
1
Извините за название, исправил. На самом деле я не получал сообщения об ошибке, пока не удалил символическую точку останова. Так что до сих пор я не мог назвать точную.
 – 
user2175433
16 Мар 2013 в 00:52

1 ответ

Лучший ответ

По сути, супервизор супервизора вашего UITextField имеет тип UITableViewCell, а не ожидаемый объект MCSwipeTableViewCell. Посмотрите, где создается ячейка, которая, скорее всего, является cellForRowAtIndexPath и / или это назначение класса для ячейки прототипа, которое вы сделали в конструкторе интерфейса / редакторе раскадровки.

1
Hermann Klecker 16 Мар 2013 в 00:50
Итак, я проверил свою раскадровку и ранее установил для класса MCSwipeTableViewCell. Проверка cellForRowAtIndexPath также не помогла, поскольку все мои указатели используют MCSwipeTableViewCell, а не UITableViewCell.
 – 
user2175433
16 Мар 2013 в 01:01
Редактирование MCSwipeTableViewCell *cell = (MCSwipeTableViewCell *) textField.superview.superview; и снятие последнего вызова superview привело к решению проблемы. Я бы даже не подумал заглянуть туда без ваших предложений. Большое спасибо!
 – 
user2175433
16 Мар 2013 в 01:11
Ах, теперь, когда я вижу сообщение об ошибке, становится ясно, что было много одного супервизора. Откуда мы могли знать? У вас могло быть обычное представление между текстовым представлением и ячейкой. - Впрочем, пожалуйста. Рад помочь.
 – 
Hermann Klecker
16 Мар 2013 в 01:18