我如何设置UIPickerView?

时间:2012-12-07 03:46:03

标签: objective-c ios xcode uipickerview choice

我正在设置UIPickerView以选择选择选择b 选择c 等等。我试图解释Apple的示例代码,但对于像我这样的初学者来说这似乎很难理解。如果可能的话,我也希望选择器视图中的选项将我带到另一个页面。

3 个答案:

答案 0 :(得分:45)

对于每个初学者来说,第一次理解这些事情是很乏味的。

无论如何,你知道如何使用UITableView吗?您知道如何使用UITableViewDelegateUITableViewDataSource吗?如果你的答案是肯定的,那么想象UIPickerView就像UITableView s(但请记住它们不是UITableViewController)。

让我们说,我有一个UIPickerView

UIPickerView *objPickerView = [UIPickerView new];  // You need to set frame or other properties and add to your view...you can either use XIB code...

1)首先,您需要通过IB或代码将delegatedataSource分配给UIPickerView。这取决于你的实现(所以这个步骤看起来非常类似于UITableView,不是吗?)

像这样:

objPickerView.delegate = self; // Also, can be done from IB, if you're using
objPickerView.dataSource = self;// Also, can be done from IB, if you're using

2)接下来,您需要定义多个部分,如下所示:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {
     return 1;  // Or return whatever as you intend
}

2)然后你需要定义你需要的行数:

- (NSInteger)pickerView:(UIPickerView *)thePickerView 
numberOfRowsInComponent:(NSInteger)component {
     return 3;//Or, return as suitable for you...normally we use array for dynamic
}

3)然后,定义行的标题(如果你有多个部分,那么每个部分的标题):

- (NSString *)pickerView:(UIPickerView *)thePickerView 
             titleForRow:(NSInteger)row forComponent:(NSInteger)component {
     return [NSString stringWithFormat:@"Choice-%d",row];//Or, your suitable title; like Choice-a, etc.
}

4)接下来,当有人点击某个元素时你需要获取该事件(因为你想导航到其他控制器/屏幕):

- (void)pickerView:(UIPickerView *)thePickerView 
      didSelectRow:(NSInteger)row 
       inComponent:(NSInteger)component {

//Here, like the table view you can get the each section of each row if you've multiple sections
     NSLog(@"Selected Color: %@. Index of selected color: %i", 
     [arrayColors objectAtIndex:row], row);

     //Now, if you want to navigate then;
     // Say, OtherViewController is the controller, where you want to navigate:
     OtherViewController *objOtherViewController = [OtherViewController new];
     [self.navigationController pushViewController:objOtherViewController animated:YES];

}

这就是你需要的所有实现。

答案 1 :(得分:9)

我将简要解释如何以编程方式实现

- (void)viewDidLoad {
    [super viewDidLoad];

    UIPickerView * picker = [UIPickerView new];
    picker.delegate = self;
    picker.dataSource = self;
    picker.showsSelectionIndicator = YES;
    [self.view addSubview:picker];
}

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return 3;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSString * title = nil;
    switch(row) {
            case 0:
                title = @"a";
                break;
            case 1:
                title = @"b";
                break;
            case 2:
                title = @"c";
                break;
    }
    return title;
}

基本上在viewDidLoad我们正在为视图创建并添加UIPickerView,告诉它我们的控制器同时提供delegatedataSource(你可以这样做)在Interface Builder中也是如此)

然后我们实现两个数据源方法,以分别告诉pickerView有多少个组件和每个组件有多少行numberOfComponentsinPickerView:pickerView:numberOfRowsInComponent:

最后,我们正在实现委托方法pickerView:titleForRow:forComponent:,它返回每一行的内容。

如果要在选择行时自定义行为,则可以实现委托方法pickerView:didSelectRow:inComponent: - 顾名思义 - 每次选择行时都会调用该方法。

答案 2 :(得分:4)

UIPickerView使用类似于UITableView的一个parten。 DataSourceDelegate协议。

DataSource方法用于告诉选择器您的选择器中有多少“列”和多少“行”。
虽然Delegate方法适用于其余部分,行的高度,列的宽度,视图或标题以及选择器移动时的回调。
UIPickerView

相关问题