2015-03-13 3 views
0

У меня есть объект Core Data, называемый Drug, который содержит 4 атрибута; drugEnabled, drugName, drugAdmin, drugExpire.Разделение одного объекта Core Data на несколько UITableViewCells

Объект Core Data предварительно заполняется путем разбора файла JSON, так что одна запись может выглядеть так: «DrugName»: «Drug 1», «drugEnabled»: true, «drugAdmin»: «1/1/90», «drugExpire»: «1/1/00»

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

- Drug 1 (on) 
- - Drug 1 Admin Date 
- - Drug 1 Expire Date 
- Drug 2 (on) 
- - Drug 2 Admin Date 
- - Drug 2 Expire Date 
- Drug 3 (off) 
- Drug 4 (off) 
- Drug 5 (on) 
- - Drug 5 Admin Date 
- - Drug 5 Expire Date 

Потому что я не использую никаких разделов, а потому, что каждый объект распространяется через 3 различных строк в таблице, я изменил numberOfRowsInSection так, что возвращаемые fetchedResultsController.fetchedObjects Количество умножается на 3, т.е.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [self.fetchedResultsController.fetchedObjects count] * 3; 
} 

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

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

    Drug *drug = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    if (indexPath.row % 3 == 0) { 
    static NSString *cellIdentifier = @"cellDrug”; 
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

     cell.drugName.text = drug.drugName;  
     return cell; 
    } 

    else if (indexPath.row % 3 == 1) { 
    static NSString *cellIdentifier = @"cellAdmin"; 
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

     cell.drugAdmin.text = drug.drugAdmin;  
     return cell; 
    } 

    else if (indexPath.row % 3 == 2) { 
    static NSString *cellIdentifier = @"cellExpire"; 
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

     cell.drugExpire.text = drug.drugExpire;  
     return cell; 
    } 

    else { 
     // never returned 
     return cell; 
    } 
} 

Для полноты я установил высоты ячеек следующим образом:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row % 3 == 0) { 
     return 48; 
    } 

    else if (indexPath.row % 3 == 1) { 
     return 38; 
    } 

    else if (indexPath.row % 3 == 2) { 
     return 38; 
    } 

    else { 
     return 100; 
    } 
} 

ошибка Я бегу в том, что в методе cellForRowAtIndexPath - как лучше, как я могу определить, - количество объектов, возвращаемых основных данных не совпадает с числом строк, которые находятся в моем UITableView. По сути, я беру 5 объектов Core Data и разделяю их на 15 различных UITableViewCells. В зависимости от того, когда я создаю свой объект Drug, я либо получаю [_PFArray objectAtIndex:]: index (5) beyond bounds (5), либо получаю no object at index 6 in section at index 0 как свою ошибку. Я понимаю ошибку, однако я потерял, как ее решить.

Опять же, основная предпосылка этой таблицы заключается в том, чтобы скрыть и показать связанные строки с помощью коммутатора и сделать это в одной таблице разделов. Я не смог найти примеров, демистифицирующих это, и я думаю, что я довольно близко, но эта ошибка заставила меня зажать. Кто-нибудь видел хорошие учебники/предложения по отображению одной таблицы разделов, чтобы пользователь мог скрывать и показывать строки на основе разных критериев?

+0

Проблемы: лекарство * drug = [self.fetchedResultsController objectAtIndexPath: indexPath]; вы получаете другой препарат, когда вам нужно получить только новый препарат после 3 указательных путей. –

+1

Из вашего описания кажется, что предположения нумерации в коде неверны. Пять объектов преобразуются только в 15 строк, если все 5 «включены», а также «% 3» не работает, если какая-либо из записей «выключена». Например, в вашем текстовом представлении у вас есть 5 препаратов, но всего 11 строк. –

+0

Том, вы правы в том, что если какая-либо из 5 записей «выключена», у вас больше не будет 15 строк (3x5), что является частью проблемы, с которой я пытаюсь обвести голову. У Мунди было хорошее предложение о совместном объединении ячеек как «закрытых» и «расширенных», но я не уверен, что это изменит значительную часть проблем с кодом. Я полагаю, что альтернативой было бы вовсе не скрывать их и вместо этого просто отключить их и, возможно, изменить их содержимое на что-то вроде «n/a» – pscarnegie

ответ

0

Вам необходимо исправить indexPath.row (так как вы возвращаете количество * 3) перед вызовом

Drug *drug = [self.fetchedResultsController objectAtIndexPath:indexPath] 

Так что вам нужно будет создать новый indexPath, который что-то вдоль линий

NSIndexPath *adjustedIndexPath = [NSIndexPath indexPathForRow:indexPath.row/3 inSection:indexPath.section]; 
Drug *drug = [self.fetchedResultsController objectAtIndexPath:adjustedIndexPath]; 
+0

Тейлор, ваше приспособление с настройкойIndexPath, похоже, прекрасно делает трюк, хотя Мунди делает очень хороший момент в его усложнении. Огромное спасибо вам обоим с удивительным быстрым ответом, указывающим на меня в правильном направлении. – pscarnegie

2

Если некоторые ячейки будут открыты (в результате получается еще одна ячейка), а другие закрыты (в результате получится еще 3 ячейки), расчеты по индексному пути будут довольно сложными. Просто работа с модулем 3 от indexPath.row не сократит его.

Другим решением могло бы быть объединение трех ячеек в одно. Вам понадобится только два типа ячеек, «закрытые» и «расширенные». Тогда вам не придется больше думать об арифметике указательного пути от NSFetchedResultsController.

Вы все равно должны отслеживать, какие ячейки открыты и с ними расширены. Вам просто нужно учитывать это в двух местах: cellForRowAtIndexPath и heightForRowAtIndexPath.

+0

Мунди, проницательность, предоставленная Тейлором, кажется, делает трюк, хотя вы делаете большой вывод, что это становится все более сложной задачей. Я до сих пор не занимался проблемой скрытия и отображения строк, а также связанными обновлениями с Core Data. Итак, мы увидим, насколько сумасшедшая эта концепция. Спасибо вам за быстрый ответ. – pscarnegie

+1

Формула Тайлора будет работать только в том случае, если все строки «открыты». Это не то, что вы хотите. – Mundi

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