У меня есть UITableView
с переупорядочиваемыми строками, и я использую стандартное свойство UITableViewCell.text
для отображения текста. Когда я нажимаю «Изменить», перемещаю строку, нажимаю «Готово», затем нажимаю на строку, встроенный UILabel
становится полностью белым (текст и фон) и непрозрачным, а синий оттенок ячейки за ним не отображается. Что дает? Есть ли что-то, что я должен делать, а я нет? У меня есть хакерское решение, но я хочу настоящего Маккоя.
Вот как это воспроизвести:
Начиная со стандартного шаблона «Навигационное приложение» в iPhone OS 2.2.1 SDK:
Открыть RootViewController.m
Раскомментируйте viewDidLoad
и включите кнопку редактирования:
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
Укажите, что таблица имеет несколько ячеек:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 4;
}
В tableView:cellForRowAtIndexPath:
добавьте строку для установки свойства текста ячейки и, следовательно, для использования встроенного подпредставления UILabel:
// Set up the cell...
cell.text = @"Test";
Чтобы включить переупорядочение, раскомментируйте tableView:moveRowAtIndexPath:toIndexPath:
. Реализация по умолчанию пуста, что хорошо в этом случае, так как шаблон не включает модель данных.
Настройка проекта для симулятора, ОС 2.2.1, Build and Go. Когда приложение запустится, нажмите «Изменить», затем сдвиньте любую строку на новую позицию, нажмите «Готово», а затем нажмите каждую строку по одной за раз. Обычно касание выделяет строку, окрашивает ее в синий цвет и делает текст белым. Но при нажатии на строку, которую вы только что переместили, и оставляют цвет фона UILabel белым. В результате получается белое открытое пространство с синими полосами по краям. Как ни странно, после первого фальшивого касания появляется другое касание, чтобы исправить проблему.
Пока что я нашел хак, который это исправляет, но я не доволен этим. Он работает, гарантируя, что встроенный UILabel
не будет непрозрачным и не будет иметь фонового цвета, сразу после выбора.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// hacky bugfix: when a row is reordered and then selected, the UILabel displays all crappy
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
for (UIView *view in cell.contentView.subviews) {
if ([[view class] isSubclassOfClass:[UILabel class]]) {
((UILabel *) view).backgroundColor = nil;
view.opaque = NO;
}
}
// regular stuff: only flash the selection, don't leave it blue forever
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Кажется, это работает, но я не ожидаю, что это будет хорошей идеей навсегда. Как правильно это исправить?