У меня есть UIPickerView. Я настраиваю его строки через viewForRow его делегата следующим образом:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
if (view) {
return view;
} else {
NSString *s = [datePickerValues objectAtIndex:row];
UILabel *l = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 44)] autorelease];
// l.text = s;
l.text = [NSString stringWithFormat:@"%@ r:%ld", s, row];
l.font = [UIFont boldSystemFontOfSize:18];
l.textAlignment = UITextAlignmentCenter;
l.backgroundColor = [UIColor purpleColor];
return l;
}
}
Когда я немного раскручиваю его, строки смешиваются.
Я даже получаю один и тот же ряд два или более раз, а иногда пропускаю ряды. Счетчик строк всегда равен 10 тыс., Он просто вызывает метод делегата viewForRow
с неверным параметром row
.
Я использую пареметр row
для идентификации строк. (как сказано в документации). Он имеет один компонент, поэтому параметр component
всегда равен 0
, я проверял это с помощью отладчика.
Еще одна странная вещь, согласно документации, когда я создаю представление для конкретной строки, параметр делегата view
будет иметь такое представление, но с помощью отладчика, который я видел, иногда вызывается viewForRow
делегата. более одного раза для одной строки с view = nil
.
Есть идеи, почему это странное поведение? Я новичок в какао и Obj-C, я делаю что-то не так?
EDIT:
Из документов:
view
- Объект представления, который ранее использовался для этой строки, но теперь скрыт и кэширован представлением средства выбора.
Таким образом, это означает, что во второй раз, когда делегат viewForRow
вызывается для конкретной строки, он будет иметь представление, возвращаемое при вызове 1. Это имеет смысл, так как в этом случае делегату не придется заново создавать представление снова и снова, когда пользователь вращает элемент управления.
Я убедился, что на самом деле viewForRow
вызывается КАЖДЫЙ раз, когда отображается строка, даже если она отображалась ранее.
Что тогда использовать для параметра view
? Два ответа пока не верны.