【问题标题】:UIPickerView crashing when switching segemented control切换分段控件时 UIPickerView 崩溃
【发布时间】:2011-01-05 11:25:14
【问题描述】:

我有四个 NSDictionaries,我想根据分段控件来填充选择器视图。 使用我拥有的代码,第一个分段控件/选择器视图工作正常,但是当我切换到第二个段时,选择器视图仅加载第二个字典的一部分,即它加载与第一个字典中计数的行数相同的行数。当我将分段控件更改为第三或第四段时,它会简单地崩溃并出现 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 -

任何帮助将不胜感激 谢谢

更新

在更改分段控件时使用以下内容。有没有人在 viewDidLoad 和这个 IBAction 中看到 alloc、init、release 相同的选择器视图中的任何问题。正如您可能已经猜到的那样,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];

}

【问题讨论】:

  • 当你选择一个段时你正在执行什么代码?
  • 我的猜测是,selectedSegmentIndex 值在某处被重置。
  • selectedSegementIndex 不会在任何地方重置

标签: iphone objective-c


【解决方案1】:

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

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

更新

本质上,当您(有效地)通过分段控件更改当前数据源时,您需要将 selectedRowInComponent 设置为零并在您的 UIPickerView 上调用 reloadAllComponents。那应该整理这一切。因此,您可以将其放在您用来响应分段控件更改的操作中。

【讨论】:

  • @middaparka,我希望你不介意详细说明,当我尝试 reloadAllComponents 最长的字典时它不起作用,我应该把它放在哪里并记住我正在使用 didSelectRow 来填充文本字段我将如何使用 selectedRowinComponent?
  • @middaparka- 我是 alloc init 并在视图中释放我的 UIPickerview 确实会加载,因为我根据输入的文本字段对其进行动画处理,所以我无法使用 [pickerView reloadAllComponents]
  • @Mattog1456 - 认为您必须为它创建一个实例变量。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多