Пропуск строки IOS – cellForRowAtIndexPath

В принципе, функция cellForRowAtIndexPath должна возвращать UITableViewCell. В моем коде я хотел бы проверить поведение, которое будет проверять что-то и пропустить ячейку, если будет найдено определенное значение.

Вот что я имею прямо сейчас:

 static NSString *FirstCellIdentifier = @"First Custom Cell"; static NSString *SecondCellIdentifier = @"Second Custom Cell"; CustomObject *o = [_customObjects objectAtIndex:indexPath.row]; if ([s.name isEqualToString:@""]) { FirstCellController *cell = [customList dequeueReusableCellWithIdentifier:FirstCellIdentifier]; if (!cell) { NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"FirstCustomCell" owner:self options:nil]; for (id currentObject in topLevelObjects){ if ([currentObject isKindOfClass:[UITableViewCell class]]){ cell = (FirstCellController *) currentObject; break; } } } // Here I do something with the cell's content return cell; } else { SecondCellController *cell = [customList dequeueReusableCellWithIdentifier:SecondCellIdentifier]; if (!cell) { NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SecondCustomCell" owner:self options:nil]; for (id currentObject in topLevelObjects){ if ([currentObject isKindOfClass:[UITableViewCell class]]){ cell = (SecondCellController *) currentObject; break; } } } // Here i do something with the cell's content return cell; } 

То, что я хотел бы сделать, это то, что если s.name не пусто, я бы хотел «пропустить» ячейку, не отображая ее и перейти к следующей.

У кого-нибудь есть какие-то советы по этому поводу?

Благодарю.

Таким образом вы не можете «пропустить» ячейку. Если ваш источник данных утверждает, что существует n строк, вы должны предоставить ячейку для каждого из них. Правильный способ – изменить ваш источник данных, чтобы требовать (n-1) строки, когда вы хотите его удалить, а затем вызвать UITableView reloadData чтобы он reloadData таблицу (и попросил вас о новых ячейках для каждой видимой строки).

Другой вариант – «спрятать» строку / ячейку. Метод, который я использовал для этого, – это обеспечить высоту 0 для данной ячейки через heightForRowAtIndexPath :

Как сказал Том, не пытайтесь «пропустить» в методах UITableViewDelegate, а вместо этого поместите эту логику в методы UITableViewDataSource … В качестве примера вы можете настроить общий метод для фильтрации ваших данных:

 - (NSArray*)tableData { NSMutableArray *displayableObjects = [NSMutableArray array]; [displayableObjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CustomObject *customObject = (YourCustomObject *)obj; if (customObject.name && ![customObject.name isEqualToString:@""]) { // only show in the table if name is populated [displayableObjects addObject:customObject]; } }]; return displayableObjects; } 

а затем в ваших методах источника данных используйте это, чтобы получить предварительно отфильтрованные данные, которые вы хотите отобразить в таблице:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [[self tableData] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomObject *o = [[self tableData] objectAtIndex:indexPath.row]; .... } 

Таким образом, всякий раз, когда вызывается reloadData, он всегда пропускает отфильтрованные данные при создании ячеек.

Вы можете пропустить ячейку, не показывая ее в виде таблицы. (Я предполагаю, что то, что вы хотите) Просто используйте это:

 cell.hidden = YES; return cell 

EDIT: Недействительное решение. (Листья Пустое место вместо ячейки)

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