Я пытаюсь сделать подкласс UITableViewController, предоставляя мне UITableView с настройками моего приложения. У меня проблема при перезагрузке данных об изменении состояния UISwtitch.
Таблица состоит из 3 разделов:
секция 1 - один ряд постоянно
раздел 2 - UISwitch в первом ряду
сделать этот раздел состоит из 1 или 3
ряды (в зависимости от состояния
UISwitch)
раздел 3 - UISwitch в первом ряду
сделать этот раздел состоит из 1 или 3
ряды (в зависимости от состояния
UISwitch), но с другим UISwitch
и дополнительные строки данных.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch ( section )
{
case 0:
return 1;
break;
case 1:
if ( limit_password_attempts )
return 3;
else
return 1;
break;
case 2:
if ( lock_when_inactive )
return 3;
else
return 1;
break;
default:
return 1;
break;
}
}
Эти два UISwitch-ов в первых рядах второго и третьего разделов меняют BOOL соответственно
BOOL limit_password_attempts;
BOOL lock_when_inactive;
Моя проблема - когда я переключаю UISwitch (для exmpl) во втором разделе, тогда я ожидаю, что мой второй раздел расширится еще на 2 строки и будет заполнен новыми данными. Это расширяется, но новые клетки выглядят не так, как я хочу. Вторая строка становится копией первой строки в следующем разделе (строка с UISwitch для третьего раздела), а третьи строки возвращаются корректно в случае, если третий раздел не был расширен ранее, и если это было так, то эта строка становится копия второго ряда из третьего раздела.
Так что моя настройка ячейки выглядит следующим образом, я думаю, ошибка где-то здесь.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = nil;
static NSString *EnabledCellIdentifier = @"Enabled";
cell = [tableView dequeueReusableCellWithIdentifier:EnabledCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc]
initWithStyle: UITableViewCellStyleDefault
reuseIdentifier: EnabledCellIdentifier]
autorelease];
cell.detailTextLabel.enabled = YES;
switch ( indexPath.section )
{
case 0: // section 1
cell.textLabel.text = @"Banks settings";
break;
case 1: // section 2
{
switch ( indexPath.row )
{
case 0:
{
cell.textLabel.text = @"Limit passwords attempts";
UISwitch* actSwitch = [[UISwitch alloc] initWithFrame: CGRectZero ];
[cell setEditingAccessoryView: actSwitch];
[actSwitch setTag: indexPath.section];
[actSwitch addTarget: self
action: @selector(actSwitchChanged:)
forControlEvents: UIControlEventValueChanged];
[self.view addSubview:actSwitch];
[actSwitch setOn:YES animated:NO];
[actSwitch setOn:NO animated:NO];
actSwitch.on = NO;
[cell addSubview: actSwitch];
cell.accessoryView = actSwitch;
[actSwitch release];
break;
}
case 1:
cell.textLabel.text = @"Lock after 3 atempts";
break;
case 2:
cell.textLabel.text = @"Lock for 30 min";
break;
default:
break;
}
break;
}
case 2: // section 3
{
switch ( indexPath.row )
{
case 0:
{
cell.textLabel.text = @"Lock when inactive";
UISwitch* pactSwitch = [[UISwitch alloc] initWithFrame: CGRectZero ];
[cell setEditingAccessoryView: pactSwitch];
[pactSwitch setTag: indexPath.section];
[pactSwitch addTarget: self
action: @selector(actSwitchChanged:)
forControlEvents: UIControlEventValueChanged];
[self.view addSubview:pactSwitch];
[pactSwitch setOn:YES animated:NO];
[pactSwitch setOn:NO animated:NO];
pactSwitch.on = NO;
[cell addSubview: pactSwitch];
cell.accessoryView = pactSwitch;
[pactSwitch release];
break;
}
case 1:
cell.textLabel.text = @"Lock when inactive for 20 min";
break;
case 2:
cell.textLabel.text = @"Unlock key";
break;
default:
break;
}
break;
}
default:
NSLog(@"%d", indexPath.section );
break;
}
}
return cell;
}
Похоже, есть какой-то скрытый от меня массив с данными строк, который заполняется onec, и контроллер таблицы каким-то образом обновляет таблицу в зависимости от того, какая строка появилась, обновляя только их. Почему он делает копии, при добавлении строки в раздел. Это как вставка узла в массив. Я думал, что это должно продвигать клетки вперед, а не просто копировать.
Должен ли я удалить строки, чтобы сделать такой вид обновления таблицы?
Я полагаю, что мне здесь не хватает некоторых базовых вещей. Какая-то концепция MVC? Но действительно ли здесь необходимо иметь модель данных или нет? Зачем? Если да, то как я могу это сделать?
Спасибо за любые ответы.
Хорошего дня.
Это было в моем коде. Я просто не записал это в своем вопросе.
Метод reloadData вызывается после переключения UISwtitch:
[pactSwitch setTag: indexPath.section];
[actSwitch addTarget: self
action: @selector(actSwitchChanged:)
forControlEvents: UIControlEventValueChanged];
В методе actSwitchChanged:
-(void) actSwitchChanged: (UISwitch*) pSwitch {
if ( [pSwitch tag] == 1 ) //section 2
limit_password_attempts = !limit_password_attempts ;
else if ( [pSwitch tag] == 2 ) //section 3
lock_when_inactive = !lock_when_inactive;
[self.tableView reloadData];
}
Таким образом, reloadData изменяет содержимое viewTable, но делает это не так, как я ожидаю.
Есть идеи?