【问题标题】:UIPickerView appears but doesn't show dataUIPickerView 出现但不显示数据
【发布时间】:2011-11-03 21:57:29
【问题描述】:

在过去的两天里,我一直在四处寻找答案,但我似乎无法得到答案。据我所知,我已经正确设置了所有内容,但它就是不想工作。

我的应用程序扫描二维码标签并将它们保存到一个可变数组中。我需要创建一种方法,以便用户可以从数组中删除一些标签对象,所以我使用 UIPickerView 来显示标签编号列表,从中选择要删除的标签。

这是我所拥有的:

在 .h 文件中

@interface ViewController : UIViewController
    UIPickerView *tagPickerView;
    NSMutableArray *tagPickerData;

@property (nonatomic, retain) IBOutlet UIPickerView *tagPickerView;
@property (nonatomic, retain) NSMutableArray *tagPickerData;

在 .m 文件中

    @synthesize tagPickerView;
    @synthesize tagPickerData;

-(void) viewDidLoad{
        tagPickerData = [[NSMutableArray alloc]init];
        [tagPickerView setDelegate:self];
        [tagPickerView setDataSource:self];
    }

- (void) dealloc{
    [tagPickerView release];
    [tagPickerData release];
    [super dealloc];
}

- (void) imagePickerController: (UIImagePickerController*) reader
     didFinishPickingMediaWithInfo: (NSDictionary*) info
    {
    [tagPickerData addObject:tagString]; //tagString is the value returned from the QRCode reader
}

  #pragma mark -
#pragma mark tagPickerView Data Source Methods
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)tagPickerView{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)tagPickerView
numberOfRowsInComponent:(NSInteger)component{
    return [tagPickerData count];


}

#pragma mark tagPickerView Delegate Methods
-(NSString *)pickerView:(UIPickerView *)tagPickerView
            titleForRow:(NSInteger)row
           forComponent:(NSInteger)component{
    return [self.tagPickerData objectAtIndex:row];
}

(我认为这就是一切。)

在 IB 中,我为 File's Owner 设置了 dataSource、delegate 和 tagPickerView。 UIPickerView 是隐藏的,直到调用删除命令(在本例中为摇晃手机),然后它才会出现在所有内容之上。

我得到的是一个空白的选择器视图。

我可以使用 NSLog 验证每次执行扫描时都会填充数组,所以我知道我加载的不是空数组。我还可以验证显然正在读取数据源方法,因为我可以将组件的数量更改为 2,并且它会在拾取器出现时反映出来——两个旋转的轮子。但我不知道如何验证 Delegate 方法是否有效。

我想知道是否有一种方法可以根据命令填充选择器,例如当手机摇晃时,而不是使用委托......或者它甚至可以这样工作吗?

所有参考资料的问题在于它演示了如何使用一个用对象初始化的数组,即

NSArray *array = [[NSArray alloc] initWithObjects:@"String 1",@"string 2",@string 3",(etc.) ,nil];

但我似乎找不到任何显示如何从根据用户收集的信息创建的数组中加载选择器的内容。常识告诉我它应该以同样的方式工作,但我学会了在使用 Objective-C 时放弃常识。

这里有 UIPickerView 专家可以帮助我吗?

谢谢

【问题讨论】:

    标签: iphone ios nsmutablearray uipickerview


    【解决方案1】:

    无论何时更改tagPickerData 数组的内容,都需要调用[tagPickerView reloadAllComponents]。选择器对其底层数据一无所知 - 您必须向它发送该消息以使其知道它应该调用其数据源方法。

    【讨论】:

    • 完美!这正是我所需要的,而且我想它比我想象的更直观。我回顾了我看到的所有示例,但没有一个使用 reloadAllComponents 消息提及。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多