UITableView с одной пользовательской ячейкой? (IPhone) - PullRequest
0 голосов
/ 25 февраля 2010

Я столкнулся с небольшой проблемой. Обычно при работе с UITableView я создаю специальный метод configureCell, который строит ячейки, когда они нужны для tableView. Поэтому cellForRowAtIndexPath запрашивает configureCell, чтобы получить новую ячейку, если в кэше не найдено ни одной.

В части cellForRowAtIndexPath, которая запускается каждый раз, когда пользователь прокручивает:

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {       
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
            [self configureCell:cell atIndexPath:indexPath];
        }
//this part is always executed!
}

Я устанавливаю значения меток и т. Д. Из моей модели. Это прекрасно работает, и я считаю, что так и должно быть, чтобы работать должным образом и меньше всего загружать процессор. Из того, что я могу прочитать в TableView Guide.

Моя проблема в том, что первая ячейка в моем tableView отличается от других. У меня есть специальный значок и другие вещи, которые отделяют его от других ячеек.

В моей ячейке конфигурации я попытался спросить:

if (indexPath.row == 0) {

    //do special setup!

}

Это плохая идея, поскольку tableView ленивый загружает ячейки, и поэтому первая неэкранная ячейка при прокрутке на экране также получает indexPath.row = 0, так что теперь у меня есть «специальная ячейка» для каждой 7 кл. Как мне обойти это?

Вторая проблема, которая также возникает из вышеприведенного: у меня есть пользовательский UIView, размещенный во всех клетках accessoryView. Когда пользователь нажимает кнопку «Редактировать», все дополнительные элементы ячеек должны измениться на значок, указывающий, что мы находимся в «режиме редактирования». Здесь, опять же, это происходит только для ячеек на экране, когда прокрутка «старых» ячеек либо извлекается из кэша, либо создаются новые ячейки, которые не знают, что мы находимся в режиме редактирования.

Когда вы нажимаете на ячейку, никогда не возникает никаких сомнений в отношении indexPath.row подключенной ячейки, этот индекс необходимо связать с массивом модели, чтобы выяснить, что пользователь нажал. Но, похоже, применяются другие правила, когда TableView манипулирует ячейками (вытягивая их на экран, за кадром, удаляя, добавляя).

Наверное, я спрашиваю; чтобы следовать передовому опыту и не бороться с SDK, что я должен сделать, чтобы получить желаемую функциональность, и на каком этапе жизненного цикла Cell я должен применить эту логику?

Надеюсь, кто-то может направить меня в правильном направлении :) заранее спасибо :) 1029 *

1 Ответ

1 голос
/ 12 марта 2011

Я думаю, что проблема не в том, что первая ячейка вне экрана находится на indexPath.row = 0. Проблема в том, что вы используете один и тот же CellIdentifier для обычных и пользовательских ячеек. Поэтому, когда TableView выходит из очереди кэшированной ячейки, он иногда захватывает вашу пользовательскую ячейку, в которой есть значок.

Поскольку вы дали ему тот же CellIdentifier, что и ваши обычные ячейки, он не знает, что они не совпадают.

Как-то так должно это исправить:

static NSString *CellIdentifier;
if([indexPath row] == 0){
    CellIdentifier = @"CustomCell";
} else {
    CellIdentifier = @"Cell";
}

Я не уверен в вашей проблеме с кнопкой редактирования, но это может быть связано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...