我有一个UIPickerView。我定制它通过它的委托的viewForRow的行如下:Cocoa-Touch: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 tho,它似乎只是调用代理的viewForRow
方法,并且参数错误的参数为row
。
我使用row
paremeter来识别行。 (如文件所述)。它有一个单一的组件,所以component
参数总是0
,我已经用调试器验证了这一点。
另一个奇怪的事情,根据文档,一旦我为特定行创建视图,代理的view
参数将具有该视图,但使用调试器我已经看到代理的viewForRow
有时被称为多次对于同一行view = nil
。
任何想法为什么这种奇怪的行为?我是可可和Obj-C的新手,我做错了什么?
编辑:
从文档:
view
- 以前使用的此行,但隐时现,并通过选择器视图缓存的视图对象。
所以这意味着第二次为代表的特定行调用代理的viewForRow
时,它将在调用1中返回视图。这是有道理的,因为这样委托人就不必重新创建视图并随着用户旋转控制而结束。
我已经验证过,实际上viewForRow
被称为每次显示一行时,即使它以前显示过。
那么view
参数的用法是什么?迄今为止的两个答案似乎并不合理。
是的,它在这种情况下工作,但请阅读我上面的编辑 – Prody 2009-10-09 13:48:10
这只是我的猜测,但很容易检查。必须有一些术语混淆 - 您的选取器(和数据源)中的实际行以及选取器显示的行。因此,在第二个定义中,标准选取器只有7行 - 5个可见,2个用于滚动目的。我添加了NSLog消息 - UIPicker为我创建了7个视图。 但我同意文档在这一点上显得有点混乱。 – Vladimir 2009-10-09 14:02:10