UISwitch в пользовательском accessoryView - PullRequest
2 голосов
/ 12 февраля 2011


У меня есть UITableViewCell подкласс, в котором я использую UISwitch как accessoryView таким образом:
mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
self.accessoryView = mySwitch;
и все ок! Приложение работает отлично.

Теперь мне нужно добавить немного UIImageView над переключателем, поэтому я подумал: «Хорошо, давайте создадим собственный accessoryView!» UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 10.0f, 100.0f, 60.0f)];<br/> ...<br/> mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0.0f, 22.0f, 94.0f, 27.0f)];<br/> [myView addSubview:mySwitch];<br/> self.accessoryView = myView;<br/> [myView release];<br/>
Все вроде бы нормально, но поведение странное. Когда я открываю другой viewcontroller и возвращаюсь к столу, переключатели таинственным образом меняются ...
Это не проблема в управлении данными, а только в перерисовке ячеек ... Пожалуйста, помогите мне, что я могу сделать?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 12 февраля 2011

Это происходит потому, что клетки используются повторно.Таким образом, если вы добавили подпредставление в представление содержимого ячейки, а затем после повторного использования этой ячейки в другой строке, это представление появится в этой строке.Лучший способ избежать этого - хранить NSArray в источнике данных вашей таблицы (обычно это ваш контроллер представления), который содержит все пользовательские представления (с подпредставлениями).Тогда вы можете сделать так:

-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath {
    NSInteger row = indexPath.row;
    static NSString* cellIdentifier = @"Trololo";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
    if( !cell ) {       
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier: cellIdentifier] autorelease];
    }

    [[cell.contentView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
    [cell.contentView addSubview: [_your_cell_views objectAtIndex: row]];

    return cell;
}
0 голосов
/ 12 февраля 2011

Эмм ... Я нашел проблему ... это не было связано с перерисовкой таблицы ...
На UIControlEventValueChanged селектор получает значение переключателя и ячейку indexPath.row следующим образом:
UISwitch *tempSwitch = (UISwitch *)sender; <br/> UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];
и затем он обновляет соответствующий объект (из класса логики данных), сохраненный в NSMutableArray (источник данных табличного представления)

Но теперь коммутатор является не accessoryView, а подвидом accessoryView, поэтому объект обновляется непредсказуемым образом. Я решил со вторым superview сообщением.

Извините за мою ошибку и спасибо всем ...

...