使用 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 中设置了 UIPickerView
、UIDatePickerView
和 UITextField
。 pickerView 的dataSource
和delegate
都链接到文件的所有者,文本字段的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 的操作表,则获取空值