2013-04-22 1 views
0

У меня есть UITableViewController со статическими сгруппированными ячейками. В определенном виде я хочу удалить некоторые из ячеек. Если я просто спрячу их, он оставляет пустое пространство, поэтому я хочу установить rowHeight ячейки на 0. У меня возникают проблемы с этим, потому что я не могу получить индексную ячейку ячейки, которую я хочу скрыть. У меня есть ссылка на него через IB-соединение. После прочтения, кажется, лучший способ сделать это через метод heightForRowAtIndexPath. Вот мой код:Индекс IndexPathForCell и IndexPathForRowAtPoint

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSIndexPath *myIndexPath = [self.tableView indexPathForRowAtPoint:self.billToPostalCell.center]; 
    //crashes here 

    if ([indexPath isEqual:myIndexPath]) { 
     return 0; 
    } 
    return 44; 
} 

До этого я пытался IndexPathForCell, но и обрушится. Из того, что я читал, heightForRowAtIndexPath должен работать, даже если ячейки не видны. Когда он падает, в отладчике ничего не отображается.

+0

Вы пробовали вывести строку, возвращенную 'myIndexPath'? –

ответ

3

То, что вы делаете, вызывает бесконечную рекурсию, приводящую к ... ожиданию ... переполнение стека!

Внутри метода heightForRowAtIndexPath: вы не можете запросить таблицу для ячейки или indexPath для строки, потому что эти методы должны знать высоту ячейки. Таким образом, эти вызовы вызывают heightForRowAtIndexPath:. И так как вы снова называете одни и те же оскорбительные методы, это продолжается до тех пор, пока не начнутся бум.

Поскольку ваша цель - скрыть ячейки, вы должны удалить ячейки из таблицы, используя соответствующий метод UITableView (deleteRowsAtIndexPaths:withRowAnimation:). Конечно, сначала нужно обновить свою модель данных (чтобы удалить строки).

+0

Спасибо, как именно я сначала обновляю модель данных? Это статические ячейки с IB-соединенными UITextFields и UILabels в них, которые заполняются индивидуально в методе 'viewWillAppear'. Просто вызов метода 'deleteRowsAtIndexPaths: withRowAnimation' вызывает эту ошибку: _'NSInternalInconsistencyException ', причина:' Неверное обновление: недопустимое количество строк в разделе 4_. Из Googling я знаю, что мне нужно обновить модель источника данных, как вы сказали. – guptron

+0

Ваш метод numberOfRowsForSection должен возвращать число, основанное на некоторой модели данных, которую вы имеете (не жестко привязанной к определенному значению). Именно эту модель данных необходимо обновить. Обычно это какой-то массив. Сначала удалите объект из массива, а затем скажите таблице, чтобы удалить строку. – rmaddy

+0

Вот и все. В этом случае массив отсутствует. Делегатор dataSource таблицыView не подключен к контроллеру представления. И я не применяю ни один из методов делегата dataSource. Каждая ячейка, нарисованная в IB, имеет текстовое поле, подключенное к коду через выход IB. Затем в коде я заполняю textFields следующим образом: 'self.myTextField.text = self.customer.someString'. Я попытался установить ячейку на нуль, прежде чем удалять строку, но не кубики. – guptron

2

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

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

0

Используйте -deleteRowsAtIndexPaths:withRowAnimation, чтобы удалить строки. Никогда не манипулируйте видимостью клетки в качестве замены для ее удаления; что может привести к серьезным проблемам с памятью и является просто общей плохой практикой. Просто перейдите в NSArray, заполненный NSIndexPath строки, которую вы хотите удалить.

Вы упомянули, что метод indexPathForRowAtPoint: не работал. Это почти наверняка проблема с той точкой, в которой вы проходите. Обязательно выйдите из значения billToPostalCell.center, чтобы убедиться, что вы проходите законное значение. Однако, действительно, нет необходимости делать это, если вы имеете дело со статическими ячейками, поскольку вы уже должны знать путь индекса (по крайней мере, для первоначального удаления ячейки).

Как уже упоминалось, documentation на удалении ячеек предоставляет всю необходимую информацию.

+0

Это хороший момент, о котором я забыл упомянуть, поскольку вы используете статические ячейки, просто сравните со статическим indexPath.row. –

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