2015-04-27 5 views
5

Я пытаюсь скрыть ячейку из UITableView. как и действие delete, но я просто хочу скрыть его, чтобы позже показать его в том же положении.Скрыть ячейку UITableview

я знаю, что UITableViewCell имеет свойство, называемое «Hidden», но когда я не скрыть ячейки, используя это свойство его скрыть, но не анимированный и они оставляют пустое пространство

Пример:

  1. первая ячейка
  2. вторая клетка
  3. третья клетка

вполне возможно, что, когда я привет второй ячейки, что третье место изменения ячейки до 2?

благодарит

+1

Вы можете добавить ячейку в определенное положение, то же, что и вы удаляете., Посмотрите http://stackoverflow.com/questions/19503958/how-to-add-item-to-uitableview – Jageen

+1

Вам нужно удалить ячейку и позже вставьте ячейку. – rmaddy

+1

UITableView имеет методы вставки/удаления ячейки с опцией анимации, но вы должны управлять своим источником данных самостоятельно, пока используете эти методы. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/index.html#//apple_ref/occ/instm/UITableView/insertRowsAtIndexPaths:withRowAnimation: –

ответ

16

Один из способов эффективного «скрыть» строки с анимацией и без фактического удаления его, чтобы установить его высоту до нуля. Вы сделали бы это, переопределив -tableView:heightForRowAtIndexPath:.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat height = 0.0; 
    if (isRowHidden) { 
     height = 0.0; 
    } else { 
     height = 44.0; 
    } 
    return height; 
} 

(Вы хотели бы вернуть 0.0 только для определенных строк или строк, которые вы хотите скрыть, а не безоговорочно).

Простое изменение возвращаемого значения этого метода не приводит к тому, что вид таблицы автоматически регулирует высоту строки, чтобы заставить ее делать следующие вызовы.

isRowHidden = YES; 
[tableView beginUpdates]; 
[tableView endUpdates]; 

Если вы это сделаете, вы увидите анимированный переход между исчезновением/исчезновением.

+0

Не знаете, почему это было принято. Это скроет все строки (или ничего). – rmaddy

+0

Извините, я имел в виду, что вы не сделали бы этого для * all * rows в представлении таблицы, только тот, который вы хотели показать/скрыть. Я должен был сделать это яснее. Будет обновляться. –

+0

Вам нужна только нулевая высота для определенной строки (или строк). Как написано, вы возвращаете нулевую высоту для всех или без строк. – rmaddy

2

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

Методы, которые вы ищете, это deleteRowsAtIndexPaths:withRowAnimation: и insertRowsAtIndexPaths:withRowAnimation:. Они хорошо документированы в документации UITableView here. Вы должны будете помнить, где вы удалили ячейку, а затем вставить ее в ту же позицию позже.

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

Надеюсь, это поможет.

1

Вы должны удалить таблицу и перезагрузить вид таблицы [tbv reloadData];

+1

Важно отметить, что это скроет или покажет строку * без * анимации. –

0

Отображение соты, в зависимости от источника данных, поэтому вам нужно иметь дело с источником данных.

если dataArr является представление таблицы источника данных, в первую очередь, вы должны удалить источник данных, в котором клетка, затем

[dataArr removeObjectAtIndex:indexpath.row]; 
[self.tableView beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 

наконец, вы можете вставить источник данных, когда вы должны добавить ячейку

[dataArr insertObjectAtIndex:indexpath.row]; 
[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 
11

в СВИФТ вам нужно сделать две вещи,

  1. HIDE ваша ячейка. (потому что может использоваться повторно используемая ячейка)

  2. Установить Высота ячейки до ZERO.

Посмотрите здесь,

  1. HIDE вас сотовый.

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    
    var myCell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("cellID",forIndexPath: indexPath) as? UITableViewCell 
    
    if(indexPath.row == 1){ 
        myCell?.hidden = true 
    }else{ 
        myCell?.hidden = false 
    } 
    
    return myCell  
    } 
    
  2. Набор Высота клетки к ZERO.

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    
        var rowHeight:CGFloat = 0.0 
    
        if(indexPath.row == 1){ 
    
         rowHeight = 0.0 
    
        } 
    
        else{ 
    
         rowHeight = 55.0 //or whatever you like 
        } 
    
    } 
    
    return rowHeight 
    } 
    

С помощью этого вы можете удалить проблемы многократного использования клеток конфликта.

Вы можете сделать то же самое для cell? .tag также, чтобы скрыть конкретную ячейку по тегу.

Ref: https://stackoverflow.com/a/28020367/3411787

+0

Вопрос помечен как Objective-C, а не Swift. Ответы должны быть на соответствующем языке. – rmaddy

+6

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

+0

Скрытие 'UITableViewCell' и установка их высоты вручную - плохая идея, потому что они управляются и перерабатываются их родительским' UITableView'. Если вы измените свойства ячейки, как скрывающие ее, она останется скрытой при переработке ее 'UITableView'. –

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