2016-01-29 2 views
1

В методе UITableViewDataSource, я проверить, есть ли у меня данные:DeqeueReusableCellWithIdentifier перекрытия двух ячеек

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (data.count == 0) 
    { 
     return 1; //This one cell will be of type NoDataTypeCell 
    } else { 
     return data.count //These cells will be of type DataTypeCell 
    } 
} 

поэтому на cellForRowAtIndexPath я проверить, какой тип клеток, чтобы использовать, таким же образом:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

    SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath]; 

    if (data.count == 0) 
    { 
     NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier]; 
     //Setup the noDataCell 
     return cellNoData; 

    } else { 
     return dataCell; 
    } 
} 

Это приводит к тому, что я никогда раньше не видел. Как и ожидалось, мой контроллер загружается с пустыми данными. В результате 1 NODataTypeCell отменяется.

После ввода данных TableView перезагружается.

numberOfRowsInSectiondata.count возвращает

cellForRowAtIndexPath не возвращает noDataCell, он возвращает data.count количество dataCells

Кроме моего Tableview до сих пор noDataCell. Самая странная часть? его непосредственно над первой ячейкой в ​​таблицеView. Ячейка не поддается выбору, а также делает ячейку за ней невыбираемой. У него нет данных, поскольку он не был настроен. Но его там, и он не исчезнет.

Что я делаю неправильно?

Вот изображение перспективы отладчика вида за ячейками. Вы можете ясно видеть, что есть две ячейки первой строки, и только одна клетка на втором ряду enter image description here

+0

Вы пытались переместить dequeue SAFindSpectedTableViewCell в предложение else? Поскольку, несмотря на то, что вы не возвращаете DataCell для отображения, кажется, что процесс dequeue не обрабатывает лишнее время. – CStreel

+0

@CStreel Это ошибка, которая возникает, когда я делаю то, что вы предлагали: Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [_ UITableViewReorderingSupport _needsSetup]: непризнанный селектор, отправленный в экземпляр 0x148b4b6d0' – YichenBman

ответ

2

tableView dequeueReusableCellWithIdentifier: возвращает объект cell и добавить к tableView.

В коде выше:

SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath]; 

if (data.count == 0) 
{ 
    NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier]; 

В случае data = 0. Две ячейки уже добавляют к одному указателю путь tableView. Так что это причина для ошибки.

Вы должны отделить свой код, чтобы вернуть точную одну ячейку в indexPath как:

if (data.count == 0) 
{ 
    NODataTypeCell* cellNoData = (NODataTypeCell*)[tableView dequeueReusableCellWithIdentifier:@"noDataIdentifier]; 
    //Setup the noDataCell 
    return cellNoData; 

} else { 
    SAFindSuggestedTableViewCell* dataCell = (SAFindSuggestedTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"hasDataIdentifier" forIndexPath:indexPath]; 
    return dataCell; 
} 

Я вижу, что вы прокомментировать аварии. Я думаю, это потому, что ваша логика с вашим реальным кодом.

+0

Да, вы его получили. Проблема с логикой, это то, что должно было произойти – YichenBman

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