我创建了一个包含两个组件的UIPickerView
,第一个组件(a)的行数设置为13。另一个组件(b)具有可变行数,这取决于(a)中选择的行。
加载UIPickerView
时,我调用以下命令,以便可以在两个组件中默认选择,但是我遇到的问题是,只有组件(a)显示正确的值。组件(B)没有显示正确的行集或正确的选择。
[picker selectRow:rowA inComponent:COMPONENT_A animated:YES];
[picker reloadAllComponents];
[picker selectRow:rowB inComponent:COMPONENT_B animated:YES];
在调用此代码后,我尝试打印出以下内容,似乎打印出了正确的值,但是当选择器仅显示组件(a)时,显示的值和选择是正确的。
NSLog(@"(A) - row selected: %i", [picker selectedRowInComponent:COMPONENT_A]);
NSLog(@"(A) - number of rows: %i", [picker numberOfRowsInComponent:COMPONENT_A]);
NSLog(@"(B) - row selected: %i", [picker selectedRowInComponent:COMPONENT_B]);
NSLog(@"(B) - number of rows: %i", [picker numberOfRowsInComponent:COMPONENT_B]);
有没有人对如何调试这个或什么问题有什么想法?
更新
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 2;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
switch (component) {
case COMPONENT_A:
{
return 13;
}
case COMPONENT_B:
{
NSInteger selectedRowIdx = [picker selectedRowInComponent:COMPONENT_A];
switch (selectedRowIdx) {
case A: return 2;
case B: return 4;
case C: return 6;
case D: return 8;
case E: return 10;
case F: return 12;
case G: return 14;
case H: return 16;
case I: return 18;
case J: return 20;
case K: return 22;
case L: return 24;
default: return 1;
}
}
}
return -1;
}
#pragma mark UIPickerViewDelegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
switch (component) {
case COMPONENT_A:
{
switch (row) {
case A: return @"A";
case B: return @"B";
case C: return @"C";
case D: return @"D";
case E: return @"E";
case F: return @"F";
case G: return @"G";
case H: return @"H";
case I: return @"I";
case J: return @"J";
case K: return @"K";
case L: return @"L";
default: return @"";
}
}
case COMPONENT_B:
{
if (row == 0) {
return @"";
} else {
return [NSString stringWithFormat:@"%i", (int)row];
}
}
}
return nil;
}
最佳答案
UpIKEVIEW奇怪的怪癖之一是当你打电话时
`[.. selectRow: inComponent: animated: ]`
这将触发对代理的
[pickerView: didSelectRow: inComponent: ]
因此,很容易创建意外的争用条件,因此请检查委托的pickerview:didselectrow:in component:method,并注意,由于设置了第一个组件,此操作将在中间调用。最好为component0中选择的内容存储一个变量并关闭它,而不是关闭picker中选择的内容。你也可以考虑存储一个布尔值(listentopicker),这样你就可以把didselect放在if(listentopicker){…..},然后在使用selectRow:animated:calls设置它之前,可以将listentopicker设置为no,在viewDidAppear中设置完所有组件后将其恢复为yes。祝你好运