0

我有一个包含 4 个数组的类:tab_1、tab_2、tab_3 和 tab_T。我将选取器的委托和数据源设置为 self(这是包含数组的类)。

当文本字段开始编辑时调用选择器。我返回 NO 以防止显示键盘。我有一种方法可以为选择器设置动画。

根据触摸的文本字段,我会这样做:tab_T=tab_1; 或 2 或 3

在我看来,这个任务使 tab_T 成为选择器的数据源。此分配是否真的将数组 tab_T 绑定到数据源?有没有办法手动分配?我确定有。但是 picker.datasource=tab_1 不起作用。我收到“警告:类 'NSMutableArray' 未实现 'UIPickerViewDataSource' 协议”。

它是我的第一个应用程序,也许我忘记了我在应用程序早期所做的一步。

期待任何愿意提供帮助的人。

瓦卢

4

1 回答 1

2

UIPickerView 的数据源必须是实现 UIPickerViewDataSource 协议的类。选择器视图的填充是通过以下两种方法完成的:

– numberOfComponentsInPickerView:  
– pickerView:numberOfRowsInComponent: 

由于 NSArray 没有使用以下协议实现协议:

pickerView.datasource=someArray;

... 生成您所看到的错误,即数组未实现协议。

您需要做的第一件事是声明您的控制器实现协议,如下所示:

@interface MyControllerClass: UIViewController <UIPickerViewDataSource,UIPickerViewDelegate> 

那么你需要实现协议的方法,看起来像:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1; //or whatever
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return [self.tab_T count]; // assuming just one component
}

要实际填充组件,您需要 UIPickerViewDelegate 方法。(我知道数据源似乎应该提供数据,但由于某种原因,它们倒退了。)

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [self.tab_T objectAtIndex:row]; //assuming one component
}

以下关键的想法是实现DataSource和委托方法的对象用作选择器和任何数据结构实际上保存数据之间的接口。在这种情况下,它只是简单的数组,但它可以是任何东西,包括 Core Data、SQL 或从 URL 下载。

pickerview 根本不直接处理数据结构。实现交互的数据源和委托方法始终是对象。

于 2010-06-03T15:57:02.120 回答