Вопрос по ios, uitableview, storyboard – Как удалить ячейку из статического UITableView, созданного в раскадровке

10

Это должно быть легко, но у меня проблемы.

У меня есть статический UITableView с ячейкой, которую я хотел бы программно удалить, если она не нужна.

У меня есть IBOutlet для этого

<code>IBOutlet UITableViewCell * cell15;
</code>

И я могу удалить это, позвонив

<code>cell15.hidden = true;
</code>

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

Возможно, хаком будет изменить его высоту на 0?

<code>- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:indexPath
{
//what would I put here?
}
</code>

Спасибо!

Возможный дубликатHow to remove a Static Cell from a UITableView designed in StoryBoard Cœur
Как насчетtableView:deleteRowAtIndexPath:? Сам не пробовал, просто быстрый способ попробовать anticyclope
Спасибо! Как мне выбрать строку, которую я хочу удалить? dot

Ваш Ответ

6   ответов
6

tableView:willDisplayCell а такжеtableView:heightForRowAtIndexPath с идентификатором ячейки, чтобы показать / скрыть статическийtableview клетки, но вы должны реализоватьheightForRowAtIndexPath ссылаясь наsuperнеself, Эти два метода отлично работают для меня:

(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell.reuseIdentifier.description isEqualToString:@"cellCelda1"]) {
    [cell setHidden:YES];
    }
}

а также

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if ([cell.reuseIdentifier.description isEqualToString:@"cellCelda1"]) {
        return 0;
}
    return cell.frame.size.height;
}
Работает отлично !!
0

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

Добавьте этот код.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if (cell.tag==10) { //I have put 10 for some static cell.       
                cell.hidden=YES;
                return 0;         

    }
     cell.hidden = NO;
    return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
3

как ваша таблица должна работать, в вашем источнике данных вы можете реализоватьtableView:numberOfRowsInSection: вернуть 0 строк для раздела на основе вашей необходимой логики.

Обновлено для вашего комментария:

Параметр section будет заполняться iOS при вызове вашей реализации, поэтому все, что вам нужно, это переключатель для обработки раздела, в котором есть строка, которую вы удалили / скрыли. Пример ниже:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    switch(section) {
        case 0:  // first section of your table, change for your situation
             return 0;
        default:
             return 0;
    }
}
как выбрать раздел в коде? это то, с чем у меня действительно проблемы ... dot
Это оставляет слишком большой зазор между двумя смежными (не скрытыми) секциями, хотя ...
13

поскольку со статическими таблицами вы даже не реализуете источники данных. Высота - путь.

Попробуй это:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell == cell15 && cell15ShouldBeHidden) //BOOL saying cell should be hidden
        return 0.0;
    else
        return [super tableView:tableView heightForRowAtIndexPath:indexPath]; 
} 

Update

Похоже, что при autolayout это может быть не лучшим решением. Есть альтернативный ответВот что может помочь.

Я также получилBAD_ACCESS вызвано какой-то бесконечной петлей. Я исправил это, сравнивая не ячейку, а путь индекса следующим образом:if (indexPath.row == 3 && cellShouldBeHidden)
Согласитесь, это зациклится и даст вам BAD_ACCESS, это не должно быть принятым ответом на этот вопрос.
Он спрашивает раньше (в этом случае ячейка будет равна нулю и перейдет в супер), а также во время прокрутки, я думаю, и я не вижу, как вы получите плохой доступ с этим кодом. Вы должны опубликовать новый вопрос со ссылкой на этот ответ.
Я получилBAD_ACCESS в таком случае Не спрашивает ли TableView высотуbefore клетка инстанцирована?
0

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    int rowCount=0;
    for ( int row=0; row<[super tableView:tableView numberOfRowsInSection:section]; ++row){
        NSIndexPath* path=[NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell* cell=[super tableView:tableView cellForRowAtIndexPath:path];
        if (!cell.hidden){
            ++rowCount;
        }
    }
    return rowCount;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int realRow=-1;
    for ( int row=0; row<[super tableView:tableView numberOfRowsInSection:indexPath.section]; ++row){
        NSIndexPath* path=[NSIndexPath indexPathForRow:row inSection:indexPath.section];
        UITableViewCell* cell=[super tableView:tableView cellForRowAtIndexPath:path];
        if (!cell.hidden){
            ++realRow;
        }
        if (realRow==indexPath.row)
            return cell;
    }
    return nil;
}
0

-(void)tableViewSearchPeopleCellHide:(BOOL)hide{

    searchCellShouldBeHidden=hide;
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    cell.hidden=hide;
    self.searchPeople.hidden=hide;//UILabel
    [self.tableView reloadData];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (searchCellShouldBeHidden) //BOOL saying cell should be hidden
        return 0.0;
    else
        return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}

Похожие вопросы