我有四个NSDictionaries,我想根据一个分段控件来填充一个pickerview。 使用我的代码,第一个分段控件/选择器工作正常,但当我切换到第二个段时,选择器视图只加载第二个字典的一部分,即它加载的行数与第一个字典中计算的行数相同。当我将分段控件更改为第三或第四段时,它只会崩溃并出现一个sigabrt错误,指示当只有27存在时它不能索引item43。我怀疑这源于基于upickerview行和对象的UItextfield填充。我认为问题在于我设置数据源和委托的方式。
#pragma mark -
#pragma mark UIPickerViewDelegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if ([wine selectedSegmentIndex] == 0)
{
return [robskeys objectAtIndex:row];
}
if ([wine selectedSegmentIndex] == 1)
{
return [esabskeys objectAtIndex:row];
}
if ([wine selectedSegmentIndex] == 2)
{
return [lebskeys objectAtIndex:row];
}
else if ([wine selectedSegmentIndex] == 3)
{
return [sbskeys objectAtIndex:row];
}
return @"Unknown title";
}
#pragma mark -
#pragma mark UIPickerViewDataSource
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if ([wine selectedSegmentIndex] == 0)
{
return robskeys.count;
}
if ([wine selectedSegmentIndex] == 1)
{
return esabskeys.count;
}
if ([wine selectedSegmentIndex] == 2)
{
return lebskeys.count;
}
else if ([wine selectedSegmentIndex] == 3)
{
return sbskeys.count;
}
return 1;
}
#pragma mark -
非常感谢任何帮助 谢谢
更新
更改分段控件时使用以下命令。是否有人在alloc,init中发现任何问题,在viewDidLoad和此IBAction中发布相同的选择器视图。你可能已经猜到了UItextfield winespec称coPicker不是键盘。
-(IBAction)ValueChanged:(id)sender {
[winespec resignFirstResponder];
UIPickerView *coPicker = [[UIPickerView alloc] initWithFrame:CGRectZero];
coPicker.tag = kCountryPickerTag;
coPicker.delegate = self;
coPicker.dataSource = self;
[coPicker setShowsSelectionIndicator:YES];
winespec.inputView = countryPicker;
[winespec becomeFirstResponder];
[coPicker release];
}
答案 0 :(得分:0)
您在切换数据源时是否正在重新加载UIPickerView? (reloadAllComponents
方法应该可以解决问题。)
无论如何,问题是正在选择“超出索引”行,因此您可能还需要使用UIPickerView的selectedRowInComponent
方法来选择“安全”行(例如第一行)切换数据源时。
<强>更新强>
实质上,当您(有效地)通过分段控件更改当前数据源时,您需要将selectedRowInComponent设置为零并在UIPickerView上调用reloadAllComponents。那个应该排除全部。因此,您可以将其置于用于响应分段控件更改的操作中。