使用 UIToolBar 上的完成按钮关闭 UIPickerView

Posted

技术标签:

【中文标题】使用 UIToolBar 上的完成按钮关闭 UIPickerView【英文标题】:Dismissing UIPickerView with Done button on UIToolBar 【发布时间】:2011-06-28 15:36:34 【问题描述】:

我只是在尝试关闭UIPickerView 哪个更好——导航栏上的按钮或选择器视图上方工具栏上的“完成”按钮。我已经实现了这两个按钮,我正在尝试关闭选择器视图并退出第一响应者。

如何使用工具栏上的“完成”按钮关闭UIPickerView

这是我的UIToolBar 代码:

UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init];
keyboardDoneButtonView.barStyle = UIBarStyleBlack;
keyboardDoneButtonView.translucent = YES;
keyboardDoneButtonView.tintColor = nil;
[keyboardDoneButtonView sizeToFit];
UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                style:UIBarButtonItemStyleBordered target:self
                                                               action:@selector(pickerDoneClicked:)] autorelease];

[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];

textField.inputAccessoryView = keyboardDoneButtonView;

有人可以帮我解决这个问题吗?

【问题讨论】:

自己没有尝试过:您的问题/问题到底是什么? pickerView 不会消失?如果这不起作用,您可以手动向下设置动画并调用 removeFromSuperview 我猜。这有意义吗? 如果可能,我将尝试复制它。如果我能得到一个工作代码,我会和你分享我所拥有的 pickerview.inputAccessoryItem 不工作.. 为什么会这样? 我发现了这个博客,它展示了如何使用完成按钮来实现它 - asanhussain.blogspot.in/2012/11/… 【参考方案1】:

虽然我确信我的测试应用程序相比起来要简单得多,但我最终还是得到了它,因此希望该结构仍然适用于您的应用程序。

本质上,这就是我所做的一切。我在 IB 中设置了 UIPickerViewUIDatePickerViewUITextField。 pickerView 的dataSourcedelegate 都链接到文件的所有者,文本字段的delegate 也是如此。

在我的标题中,我将它们全部声明为以下结构

UISomething *object;
@property (nonatomic, retain) IBOutlet UISomething *object;

我还链接了协议 (<UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate>)。在实现文件中,一切都被综合了。然后在viewDidLoad,我有这个。

- (void)viewDidLoad

    UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init];
    keyboardDoneButtonView.barStyle = UIBarStyleBlack;
    keyboardDoneButtonView.translucent = YES;
    keyboardDoneButtonView.tintColor = nil;
    [keyboardDoneButtonView sizeToFit];
    UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                    style:UIBarButtonItemStyleBordered target:self
                                                                   action:@selector(pickerDoneClicked:)] autorelease];

    [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];

    textField.inputAccessoryView = keyboardDoneButtonView;
    [datePicker removeFromSuperview];
    [pickerView removeFromSuperview];
    [super viewDidLoad];

当 textField 变为活动状态时,我称之为

- (void)textFieldDidBeginEditing:(UITextField *)textField 
    [self.view addSubview:pickerView];
    [self.view addSubview:datePicker];

最后是action方法

- (IBAction)pickerDoneClicked:(id)sender 
    [datePicker removeFromSuperview];
    [pickerView removeFromSuperview];
    [textField resignFirstResponder];

这一切都对我有用。一切都按原样显示和删除。所以运气好的话,这对你也有用

【讨论】:

非常简洁的解决方法。为什么 inputAccessoryView 在 UIPickerView 中是只读的,只有 Apple 知道,但这是一个很好的解决方案。谢谢斯莱夫。 +1【参考方案2】:
-(void)pickerDoneClicked:(id)sender 
    [pickerView removeFromSuperview];

或者如果你想用动画来关闭它,用 UIView 动画改变视图框架,然后从超级视图中移除它。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

pickerView.frame = outOfScreenFrame;

[UIView commitAnimations];

outOfScreenFrame 位于 UIApplication 窗口之外的某个位置。

【讨论】:

我试过了。我收到错误 Unrecognized selector sent to instance '1290837' 不确定你做错了什么,因为我没有像 slev 那样输入你的代码,但我希望你能弄明白! :)【参考方案3】:

在斯威夫特中

lazy var inputToolbar: UIToolbar = 
    var toolbar = UIToolbar()
    toolbar.barStyle = .Default
    toolbar.translucent = true
    toolbar.sizeToFit()

    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Bordered, target: self, action: "inputToolbarDonePressed")
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)

    toolbar.setItems([spaceButton, doneButton], animated: false)
    toolbar.userInteractionEnabled = true

    return toolbar
()

func inputToolbarDonePressed() 
    view.endEditing(true)

UITextFieldDelegate

func textFieldShouldBeginEditing(textField: UITextField) -> Bool 
    textField.inputAccessoryView = inputToolbar

    return true

【讨论】:

以上是关于使用 UIToolBar 上的完成按钮关闭 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章

如果我在选择器旋转时使用完成按钮关闭 UIPickerview 的操作表,则获取空值

带有 UIToolbar 的 UIDatePicker

UIToolbar 上的按钮间距

iOS 7:如何隐藏键盘上的 DONE 按钮

为多个 UITextField 使用 inputAccessoryView UIToolbar

Swift - UIPickerView 的带有完成按钮的 UIToolbar 在横向上消失