我有一個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