У меня есть объект 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
как свою ошибку. Я понимаю ошибку, однако я потерял, как ее решить.
Опять же, основная предпосылка этой таблицы заключается в том, чтобы скрыть и показать связанные строки с помощью коммутатора и сделать это в одной таблице разделов. Я не смог найти примеров, демистифицирующих это, и я думаю, что я довольно близко, но эта ошибка заставила меня зажать. Кто-нибудь видел хорошие учебники/предложения по отображению одной таблицы разделов, чтобы пользователь мог скрывать и показывать строки на основе разных критериев?
Проблемы: лекарство * drug = [self.fetchedResultsController objectAtIndexPath: indexPath]; вы получаете другой препарат, когда вам нужно получить только новый препарат после 3 указательных путей. –
Из вашего описания кажется, что предположения нумерации в коде неверны. Пять объектов преобразуются только в 15 строк, если все 5 «включены», а также «% 3» не работает, если какая-либо из записей «выключена». Например, в вашем текстовом представлении у вас есть 5 препаратов, но всего 11 строк. –
Том, вы правы в том, что если какая-либо из 5 записей «выключена», у вас больше не будет 15 строк (3x5), что является частью проблемы, с которой я пытаюсь обвести голову. У Мунди было хорошее предложение о совместном объединении ячеек как «закрытых» и «расширенных», но я не уверен, что это изменит значительную часть проблем с кодом. Я полагаю, что альтернативой было бы вовсе не скрывать их и вместо этого просто отключить их и, возможно, изменить их содержимое на что-то вроде «n/a» – pscarnegie