ios UIPickerView作为弹出窗口

时间:2014-04-04 07:33:41

标签: iphone ios7 uipickerview

我为每个表行记录都有一个UIPickerView。这是在函数

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

这是

中的代码部分
picker = [[UIPickerView alloc]initWithFrame:CGRectMake(280, -45, 30, 20)];
    [picker setDelegate:self];

    arrayColors = [[NSMutableArray alloc] init];
    [arrayColors addObject:@"1"];
    [arrayColors addObject:@"2"];
    [arrayColors addObject:@"3"];
    [arrayColors addObject:@"4"];
    [arrayColors addObject:@"5"];
    [arrayColors addObject:@"6"];
    [arrayColors addObject:@"7"];
    [arrayColors addObject:@"8"];
    [arrayColors addObject:@"9"];
    [arrayColors addObject:@"10"];

    [cell addSubview:picker];

当我点击它们时,我希望弹出(作为模态视图)选择​​器。当我选择它应该关闭的值时。有可能吗?

3 个答案:

答案 0 :(得分:0)

是的,这是可能的。您需要创建一个包含UIPickerView和2 UIButton,OK和Cancel的视图控制器类。并以模态呈现。当用户点击确定按钮时,您可以通过委托将UIPickerView上带有所选值的事件发送到表视图控制器并关闭视图控制器。

答案 1 :(得分:0)

覆盖UITextField并实现以下方法。然后将数字选择器插入单元格,将其附加到您要修改的值(使用UITextFieldDelegate或更改事件),然后就完成了。

- (UIView *)inputAccessoryView {
    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                          target:self
                                                                          action:@selector(resignFirstResponder)];
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    toolbar.items = @[spacer, item];
    return toolbar;
}

- (UIView *)inputView {
    if ((self.minimumNumber == 0) && (self.maximumNumber == 0)) {
        self.minimumNumber = 0;
        self.maximumNumber = 9;
    }
    UIPickerView *pickerView = [[UIPickerView alloc] init];
    pickerView.backgroundColor = [UIColor whiteColor];
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [pickerView selectRow:(self.number - self.minimumNumber) inComponent:0 animated:NO];
    return pickerView;
}

- (NSInteger)number {
    return [self.text integerValue];
}

- (void)setNumber:(NSInteger)number {
    self.text = [NSString stringWithFormat:@"%d", (int)number];
}

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.maximumNumber - self.minimumNumber + 1;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [NSString stringWithFormat:@"%d", (int)(row + self.minimumNumber)];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    self.number = (row + self.minimumNumber);
}

答案 2 :(得分:0)

这里有很多问题。

  1. 对数据源中的每一行都有一个单独的选择器实例是没有意义的。更好的设计可以让您将选择器数据与行相关联,并在选择时将数据加载到公共选择器中。

    例如,如果您正在制作一个应用程序来接受食物订单,您可以将每行代表一个类别(例如饮料,主餐,配菜,甜点等),并将每个类别与一系列选项链接起来那个类别。对于这个,NSDictionary将是内部数据存储的一个很好的选择:您的密钥将是类别(可能是常量NSStrings),值将是不同选项的NSArrays。您的表将由这些常量NSString类别的数组填充,因此当点击单元格时,您可以查找它所代表的类别,并使用它来获取可能选项的数组。

    然后,您可以在单个UIPickerView上设置这些选项。采摘者很昂贵 - 他们占用大量内存并且有很多子视图。为选择器可能显示的每组选项创建不同的选择器是非常糟糕的做法。

  2. 当用户选择值时解雇UIPickerView是个坏主意。用户可以在途中停止选择一个项目(他们真正想要的那个)。在这种情况下,您的应用程序将难以使用并惹恼他们。另外,如果他们想在列表中选择第一个(默认)选项,你会怎么做?

  3. 可以模态呈现UIPickerViews。最好的方法可能是将选择器作为inputView添加到单元格中。不幸的是,UITableViewCell不接受inputView本身。您可以通过聪明的UIResponder并创建一个子类来解决这个问题,该子类允许您分配一个inputView并允许自己捕获输入焦点:

    @interface InputViewCell : UITableViewCell
    
    @property ( nonatomic, strong, readwrite ) UIView * inputView;
    
    @end
    
    @implementation InputViewCell
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    
        if( selected && !self.isFirstResponder )
        {
            [self becomeFirstResponder];
        }
        else
        {
            [self resignFirstResponder];
        }
    }
    
    - (BOOL)canBecomeFirstResponder  {  return YES; }
    
    @end