隐藏/显示UIPickerView

aah*_*ens 19 iphone uipickerview

我有一个touchesEnded事件,用于检查何时按下UITextField.我想要它做的是隐藏/显示UIPickerView.如何才能做到这一点?

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [[event allTouches] anyObject];
    if (CGRectContainsPoint([self.textField frame], [touch locationInView:self.view]))
    {
        NSString * error = @"Touched the TextField";
        UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Selection!" message:error delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
        //Want to show or hide UIPickerView
    }
}
Run Code Online (Sandbox Code Playgroud)

触摸发生时我已经分配了UIPickerView

@interface ThirdViewController : UIViewController <UITextFieldDelegate,UIPickerViewDelegate> {
    IBOutlet UIPickerView *pickerView;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*att 35

切换"隐藏"属性将起到作用,但也会给出一个非常突然的显示.

避免这种情况的一种方法是通过将选择器嵌入到UIActionSheet中来使拾取器从屏幕底部向上滑动.

这是一个例子:

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil 
delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    CGRect pickerFrame = CGRectMake(0, 0, 0, 0);
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    [sheet addSubview:pickerView];
    [pickerView release];

    [sheet showInView:view];
    [sheet setBounds:CGRectMake(0, 0, 320, 415)];
    self.actionSheet = sheet; // assuming you have setup a property to hold the action sheet
    [sheet release];
Run Code Online (Sandbox Code Playgroud)

当您完成选择器后,将其解雇:

[self.actionSheet dismissWithClickedButtonIndex:0 animated:YES];
Run Code Online (Sandbox Code Playgroud)

这种方法也可以用于掺入按钮,在选择器上方的栏("完成","上一页","下一页"等) -有一个如何做一个很好的解释在这里.


小智 23

因为我看到关于这些解决方案的评论不适用于iOS 7,我将假设此线程仍然相关并正在搜索.

我发现这样做的最好方法是将UIPickerView附加到(隐藏的)UITextField作为输入视图,如:

_myPicker = [[UIPickerView alloc] init];
_myPicker.delegate = self;
_myPicker.showsSelectionIndicator = YES;
myTextField.inputView = _myPicker;
Run Code Online (Sandbox Code Playgroud)

如果需要,您始终可以隐藏文本字段.然后,您可以通过激活文本字段作为第一响应者来显示/隐藏UIPickerView,如:

[myTextField becomeFirstResponder];
[myTextField resignFirstResponder];
Run Code Online (Sandbox Code Playgroud)

我已经在iOS 7上验证了这个功能,并且我已经让它在iOS 5上工作了.


Joe*_*out 14

UIPickerView继承自UIView,因此您应该只能切换其"隐藏"属性:

if (pickerView) pickerView.hidden = !pickerView.hidden;
Run Code Online (Sandbox Code Playgroud)


Yun*_*hel 5

我正在使用一个假人UITextField来显示/隐藏UIPickerView

首先,添加一个的UITextField作为@property你的UIViewController。(可选)同时添加UIPickerView

@property (strong, nonatomic) UITextField *dummyTextField;
Run Code Online (Sandbox Code Playgroud)

其次,指定UIPickerView作为inputViewUITextField。将自己指定为dataSourcedelegateUIPickerViewUITextField需要添加为你的一个子视图UIViewControllerview

- (void)viewDidLoad {

    [super viewDidLoad];

    UIPickerView *picker = [[UIPickerView alloc] init];
    [picker setDataSource:self];
    [picker setDelegate:self];

    self.dummyTextField = [UITextField new];
    self.dummyTextField.inputView = picker;
    [self.dummyTextField setHidden:YES];
    [self.view addSubview:self.dummyTextField];
}
Run Code Online (Sandbox Code Playgroud)

最后,添加一种机制来显示和隐藏UIPickerView。由于我使用的是虚拟道具UITextField,因此我决定添加以下UIBarButtonItem名称的“过滤器” IBAction

- (IBAction)tappedFilterButton:(UIBarButtonItem *)sender {

    if (self.dummyTextField.isFirstResponder) {

        [self.dummyTextField resignFirstResponder];
    }
    else {

        [self.dummyTextField becomeFirstResponder];
    }
}
Run Code Online (Sandbox Code Playgroud)