ОК, у меня есть таблица с тремя различными ячейками прототипа (cellVaccination, cellAdmin, cellExpire). В моем методе cellForRowAtIndexPath я раскалывается объект ядра данных через эти 3 отдельных клеток, так что структурно таблица будет выглядеть следующим образом:dequeueReusableCellWithIdentifier и пользовательские ячейки
- Drug 1
- Drug 1 Admin
- Drug 1 Expire
- Drug 2
- Drug 2 Admin
- Drug 2 Expire
- Drug 3
- Drug 3 Admin
- Drug 3 Expire
Дополнительно, я программно добавил UISwitch в «верхней (т.е. препарат 1), так что коммутатор может управлять дополнительными функциями ячеек (например, цветом, текстом и т. д.). Вот что мой нынешний cellForRowAtIndexPath выглядит следующим образом:
- (VaccineTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// we need to adjust the indexPath because we split a single core data object into 3 different rows
NSIndexPath *adjustedIndexPath = [NSIndexPath indexPathForRow:indexPath.row/3 inSection:indexPath.section];
Vaccine *vaccine = [self.fetchedResultsController objectAtIndexPath:adjustedIndexPath];
// define the switch that will get added to the primary table rows
UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
if (indexPath.row % 3 == 0) {
static NSString *cellIdentifier = @"cellVaccination";
VaccineTableViewCell *cell = [myTableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
cell.vaccineName.text = vaccine.vaccineName;
// add a switch into that table row
cell.accessoryView = switchview;
[switchview addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
switchview.tag = indexPath.row;
switchview.on = [vaccine.vaccineEnabled boolValue];
// PROBLEM AREA BELOW
if (switchview.on) {
VaccineTableViewCell *cell1 = [myTableView dequeueReusableCellWithIdentifier:@"cellAdmin" forIndexPath:[NSIndexPath indexPathForItem:indexPath.row + 1 inSection:0]];
cell1.vaccineAdmin.textColor = [UIColor redColor];
cell1.vaccineAdminDate.textColor = [UIColor redColor];
NSLog(@"Row %d is %@", indexPath.row, switchview.on ? @"ON" : @"OFF");
} else {
VaccineTableViewCell *cell1 = [myTableView dequeueReusableCellWithIdentifier:@"cellAdmin" forIndexPath:[NSIndexPath indexPathForItem:indexPath.row + 1 inSection:0]];
cell1.vaccineAdmin.textColor = [UIColor lightGrayColor];
cell1.vaccineAdminDate.textColor = [UIColor lightGrayColor];
NSLog(@"Row %d is %@", indexPath.row, switchview.on ? @"ON" : @"OFF");
}
//
return cell;
}
else if (indexPath.row % 3 == 1) {
VaccineTableViewCell *cell = [myTableView dequeueReusableCellWithIdentifier:@"cellAdmin" forIndexPath:indexPath];
cell.vaccineAdminDate.text = vaccine.vaccineAdmin;
return cell;
}
else if (indexPath.row % 3 == 2) {
VaccineTableViewCell *cell = [myTableView dequeueReusableCellWithIdentifier:@"cellExpire" forIndexPath:indexPath];
cell.vaccineExpireDate.text = vaccine.vaccineExpire;
return cell;
}
else {
// do nothing at the moment
}
}
Проблема у меня, кажется, происходит вокруг области, записанной в «проблемной области ниже» элемент, более конкретно я угадываю с dequeueReusableCellWithIdentifier. Теоретически, что должно произойти, так это то, что, когда ячейки сначала заполняются объектами Core Data, я хочу проверить, включен ли переключатель «on» или «off», и соответствующим образом отрегулировать параметр (например, цвет) что без какого-либо другого взаимодействия соответствующие строки окрашены соответствующим образом.
Что происходит, предположим, что я имитирую на iPhone 4S и что на экране отображаются 4 ряда строк или всего 12 строк (4 строки из 3 разных прототипов). Предположим также, что первые 2 включены, а второй 2 выключены, снова управляются непосредственно из Core Data. Первоначально экран будет выглядеть правильно, первые два элемента окрашены в красный цвет, а следующие два элемента окрашены в серый цвет. Однако, когда я начинаю прокручивать свой стол вверх, NEXT два (которые были на экране) окрашены в красный цвет, и поэтому шаблон продолжается. Как ни странно, когда NSLog возвращает идентификаторы строк (видели в этом разделе «проблемная область») все выглядит, как это правильно идентифицировать необходимые строки, но, видимо, это не так, то есть:
vaccinations[10952:1486529] Row 0 is ON
vaccinations[10952:1486529] Row 3 is ON
vaccinations[10952:1486529] Row 6 is OFF
vaccinations[10952:1486529] Row 9 is OFF
vaccinations[10952:1486529] Row 12 is OFF
vaccinations[10952:1486529] Row 15 is OFF
Я считаю, что это что-то делать с dequeueReusableCellWithIdentifier, однако почему NSLog правильно идентифицирует строки, но изменение цветов не попадает в правильные строки?
Это может иметь какое-то отношение к вашему программному добавлению uiswitch. Любая причина, по которой вы не просто добавляете это в свои ячейки в раскадровке? – Alex
Мне нужно иметь возможность ссылаться на переключатели по номеру тега позже, и это самый простой способ создания уникальных тегов - по мере создания ячеек. Кроме того, имейте в виду, что indexPath.row возвращает правильные ячейки и их правильные состояния переключателя, однако, когда я пытаюсь использовать indexPath.row в процедуре dequeueReusableCellWithIdentifier, я не могу постоянно нацеливаться на одни и те же ячейки. – pscarnegie
где вы добавляете переключатель в свою ячейку? – Alex