切换分段控件时UIPickerView崩溃

时间:2011-01-04 12:43:44

标签: iphone objective-c

我有四个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];

}

1 个答案:

答案 0 :(得分:0)

您在切换数据源时是否正在重新加载UIPickerView? (reloadAllComponents方法应该可以解决问题。)

无论如何,问题是正在选择“超出索引”行,因此您可能还需要使用UIPickerView的selectedRowInComponent方法来选择“安全”行(例如第一行)切换数据源时。

<强>更新

实质上,当您(有效地)通过分段控件更改当前数据源时,您需要将selectedRowInComponent设置为零并在UIPickerView上调用reloadAllComponents。那个应该排除全部。因此,您可以将其置于用于响应分段控件更改的操作中。