3

我有一个UIPickerView我正在尝试为其设置数据源;设置好后datasource,我将其放入要显示的模式弹出框中。这是代码 - manicuristArray 定义为NSArray, pvManicurist 是UIPickerView,所有代表UIPickerView都已正确设置,根据我在 SO 上找到的示例):

    -(void) showModalManicurist:(int)tag {

    UIViewController* popoverContent = [[UIViewController alloc] init];

    UIView *popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 216)];
    popoverView.backgroundColor = [UIColor redColor];
    popoverContent.contentSizeForViewInPopover = CGSizeMake(300.0, 216.0);

    //  define the UIPickerView
    pvManicurist.frame = CGRectMake(0, 0, 300, 216);

    //  fill the names from the d/b into manicuristArray
    PreferenceData *pv = [PreferenceData MR_findFirst];  //  (everything is in one record)
    NSLog(@"pv.aStaffPos1: %@", pv.aStaffPos1);

    if(pv)  {   //  fill the UIPickerView
        self.manicuristArray = [[NSArray alloc] initWithObjects: pv.aStaffPos1, pv.aStaffPos2, pv.aStaffPos3, pv.aStaffPos4, pv.aStaffPos5,
                           pv.aStaffPos6, nil];
        NSLog(@"\nmanicuristArray.count: %d",manicuristArray.count);

        pvManicurist.dataSource = self.manicuristArray;        [pvManicurist reloadAllComponents];

     }

    //  add it to the popover
    [popoverView addSubview:pvManicurist];
    popoverContent.view = popoverView;
    popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
    popoverController.delegate = (id)self;
    [popoverController setPopoverContentSize:CGSizeMake(300, 216) animated:NO];

    //  show it below the staff name textbox
    [popoverController presentPopoverFromRect:boStaff.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp
                                     animated:YES];
}

问题是我收到了这个构建警告:

构建错误:从不兼容的类型“NSArray *”分配给“id”

我认为这导致UIPicker视图不被放入UIPopover. 我还有其他几个弹出窗口,都UIDatePickers在其中,而且它们工作正常。我查看了 SO 和 Google 并没有发现任何可以回答这个特定问题的东西,即:为什么这不起作用?以及如何修复构建错误?

更新:这是 UIPickerView 的委托方法:

//--  sets number of columns
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pvManicurist  {

    return 1; // One column
}

//--  sets count of manicuristArray
-(NSInteger)pickerView:(UIPickerView *)pvManicurist numberOfRowsInComponent:(NSInteger)component  {

    return manicuristArray.count;  //set number of rows
}

//--  sets the component with the values of the manicuristArray
-(NSString *)pickerView:(UIPickerView *)pvManicurist titleForRow:(NSInteger)row forComponent:(NSInteger)component  {

    return [manicuristArray objectAtIndex:row];  //set item per row
}

这是 .h 文件中的界面:

@interface AppointmentsViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UINavigationControllerDelegate, UIActionSheetDelegate, UITextFieldDelegate,UIPickerViewDelegate, UIPickerViewDataSource  >  {
4

3 回答 3

4

您不能将数组指定为数据选取器的数据源,因为数组不提供选取器所需的信息。为了正常工作,选择器至少需要回答以下三个问题:

  • 一个picker应该有多少个组件,
  • 每个组件有多少行,以及
  • 在每个组件的每一行中放入什么数据。

数据源通过实现数据源协议回答了前两个问题:你需要

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

返回组件的数量,以及

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component

返回给定组件中的行数。在你的类中实现这两种方法,然后分配

pvManicurist.dataSource = self;

当然,您还需要实现委托的方法,但是由于您分配popoverController.delegate = (id)self;了机会,因此您已经完成了。

于 2013-04-06T21:20:29.440 回答
0

问题出在作业上

pvManicurist.dataSource = self.manicuristArray;

dataSource必须是符合协议的UIPickerViewDataSource对象,即类型的对象id<UIPickerViewDataSource。显然NSArray不符合协议。

您需要分配一个符合该协议的控制器,而不是数据本身。

于 2013-04-06T21:20:55.120 回答
0

您收到该错误消息是因为您尝试将 an 设置NSArray*为选择器视图的数据源。选择器视图的数据源应该是符合UIPickerViewDataSource协议的类的实例。

有关此协议的更多信息,请访问iOS 文档的UIPickerViewDataSource 协议参考

于 2013-04-06T21:24:09.577 回答