UITableView didSelectRowForIndexPath, не анимация выделения и отмены выбора галочки - PullRequest
1 голос
/ 21 октября 2011

Я делал это раньше, но у меня проблемы с тем, чтобы заставить его работать снова. В любом случае, в моем модельном классе у меня есть словарь, в котором есть два элемента для сортировки, и я хочу, чтобы только одно значение было ДА, а остальные - НЕТ. Я хочу, чтобы выбор элемента в UITableViewCell отражал это и оживлял выбор и отмену выбора. Таким образом, в классе модели у меня есть этот метод, который просто меняет другое значение, которое было выбрано на false:

- (void)setSingleSort:(NSString *)key {
    for (NSString *str in [_sortOrderDictionary allKeys]) {
        if (str != key) {
            [_sortOrderDictionary setObject:[NSNumber numberWithBool:NO] forKey:str];
        }
    }
}

Тогда у меня есть этот фрагмент в моем методе didSelectRowForIndexPath:

NSUInteger row = [indexPath row];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[cell setSelected:YES animated:YES];

NSString *key;
BOOL valueAtKey;
    key = [_sortCategoryList objectAtIndex:row];
    valueAtKey = [[dmgr.SortOrderDictionary valueForKey:key] boolValue];
    if (valueAtKey != YES) {
        [dmgr.SortOrderDictionary setObject:[NSNumber numberWithBool:!valueAtKey] forKey:key];
        [dmgr setSingleSort:key];
        UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:_lastIndexPath];
        oldCell.accessoryType = UITableViewCellAccessoryNone;

        [tableView deselectRowAtIndexPath:_lastIndexPath animated:YES];
    }
    _lastIndexPath = indexPath;
    [tableView reloadData]; //Edited, added this to the end and it seems to work.  Don't know why it's needed though since the deslectRowAtIndexPath should animated, along with the setSelected:Animated: right?

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Я думаю, что ваш выбор стиля является причиной. Обычно я так поступаю. В cellForRowAtIndexPath метод:

//create new or fetch dequeued cell
if((indexPath.row == self.indexPathOfCurrentValue.row) && (indexPath.section == self.indexPathOfCurrentValue.section))
     cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
     cell.accessoryType = UITableViewCellAccessoryNone;

затем в методе didSelectRowAtIndexPath сделайте что-то вроде этого:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

//APP RELATED LOGIC GOES HERE

if(nil != self.indexPathOfCurrentValue)
     [[tableView cellForRowAtIndexPath:self.indexPathOfCurrentValue] setAccessoryType:UITableViewCellAccessoryNone];

self.indexPathOfCurrentValue = indexPath;
[[tableView cellForRowAtIndexPath:self.indexPathOfCurrentValue] setAccessoryType:UITableViewCellAccessoryCheckMark];

Это обычно тот подход, который я использую, когда мне нужно поставить галочку на строке касанием пользователя и снять последнюю выбранную строку. Очевидно, переменные пути индекса currentValue содержат путь индекса последней отметки.

0 голосов
/ 21 октября 2011

Избавьтесь от этой строки:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...