当用户选择字段时,如何防止UIPickerView关闭?

时间:2017-01-27 15:51:38

标签: ios iphone uipickerview

我试图阻止我的UIPickerview在用户选择字段时关闭。我希望用户能够选择一个没有UIPickerview自动解除的字段。我尝试了很多东西,比如尝试以下但没有一个帮助过:

_txtfield.hidden=NO;
[_pickerView endEditing:NO];
[pickerView endEditing:NO];
[_txtfield endEditing:NO];
[self endEditing:NO];
_pickerView.hidden=NO;

-----------------这是更多代码----------------

  @implementation FieldWithPickerView {
    void(^pickerCallback)(NSInteger row);
    CGRect myFrame;


}

-(void)viewDidAppear{

}

-(void)commonInit:(CGRect)frame{



    [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];


    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:@{@"view":self.InputViewPicker}]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:@{@"view":self.InputViewPicker}]];
    [self.layer setCornerRadius:10.0f];
    [self setClipsToBounds:YES];


    _pickerView = [[UIPickerView alloc] init];
    _pickerView.delegate=self;




    UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    [toolBar setTintColor:[UIColor grayColor]];
    UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(removePicker)];
    UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [toolBar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]];
    [self.txtfield setInputAccessoryView:toolBar];



    self.txtfield.inputView = _pickerView;
    [_txtfield.inputView setBackgroundColor:[UIColor clearColor]];
    [_txtfield setBackgroundColor:[UIColor clearColor]];
    _txtfield.text=@"--Select---";


    _label_view.textColor=[UIColor whiteColor];

    _label_view.backgroundColor=SECURUSBLUE;
    _label_view.textAlignment = NSTextAlignmentCenter;

    _txtfield.textAlignment = NSTextAlignmentCenter;




}
-(void)removePicker
{
    [_txtfield resignFirstResponder];
}

-(void)pickerListenner:(void(^)(NSInteger row))handler
{
    pickerCallback=handler;

}

- (id)initWithFrame:(CGRect)frame
{
//    NSLog(@"initwithframe picker");

    self = [super initWithFrame:frame];
    if (self)
    {
        [self commonInit:frame];

    }
    return self;
}

#pragma mark - Picker View Data source

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

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

- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row
            forComponent:(NSInteger)component
{
    if(_pickerData.count == 0)
        return @"There is nothing";
    return [_pickerData objectAtIndex:row];
}
#pragma mark -

#pragma mark - UIPickerViewDelegate
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    // Code logic
    NSLog(@"selected row --->%ld!!!!",(long)row);
    pickerCallback(row);
//    _txtfield.text=[_pickerData objectAtIndex:row];

    _txtfield.hidden=NO;


}

- (NSInteger)selectedRowInComponent:(NSInteger)component
{
    return component;
}

1 个答案:

答案 0 :(得分:1)

您需要实现UIPickerView委托方法,因此将<UIPickerViewDelegate>添加到ViewController

viewDidLoad方法中的

符合协议,如下所示:

pickerView.delegate = self;

然后添加以下方法以检测何时选择了行:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // do nothing because it will not dismiss
}

您还需要实施numberOfRowsInComponentnumberOfComponentstitleForRow委托方法,但一旦实施了这些方法,您的选择器视图就不会在选择行时忽略。您需要在didSelectRow委托方法中手动关闭选择器视图。