【问题标题】:UIButtonBarItem does not seem to fire selectorUIButtonBarItem 似乎没有触发选择器
【发布时间】:2016-10-17 00:08:35
【问题描述】:

我正在使用 XCode 7.3 编写一个简单的 iOS 应用程序,我相信这让我可以使用 Swift 2.2。我正在尝试使用带有 UITextfield 的 UIToolbar 的 UIDatePicker,由于某种原因,我点击“取消”按钮似乎没有调用控制器上的方法 datePickerCancelled。一切都显示正常(选择器、按钮等),但事件不会触发。我尝试了几种将选择器添加到 UIBarButtonItem 的变体,但似乎没有任何效果。正如您从代码中看到的那样,这是一个非常微不足道的案例,因此它逃脱了为什么它应该如此困难。谢谢。

override func viewDidLoad() {
        super.viewDidLoad()

        var datePicker = UIDatePicker()
        var datePickerToolbar = UIToolbar()
        let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: nil, action: nil)
        let cancelButton =  UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Cancel, target: self, action: #selector(datePickerCancelled))
        let flexSpace =  UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)


        datePickerToolbar.setItems([cancelButton,flexSpace, doneButton], animated: true)
        datePicker.userInteractionEnabled = true
        cancelButton.enabled = true
        self.dateField.inputView = datePicker
        self.dateField.inputAccessoryView = datePickerToolbar
    }

    func datePickerCancelled(){
        self.datePicker.resignFirstResponder();

    }`  I

【问题讨论】:

  • 正如马特指出的那样,我未能设置工具栏的高度。尽管我可以在选择器上方看到按钮,但它仍然无法调用事件处理程序。添加以下代码解决了我的问题 self.datePickerToolbar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44)

标签: ios swift swift2


【解决方案1】:

问题出在这一行:

var datePickerToolbar = UIToolbar()

这会导致工具栏大小为零。 Cancel 按钮是可见的,但它在其父视图(即工具栏)之外——因为工具栏的大小为零。

无法点击其父视图之外的视图。

您可以通过将工具栏的clipsToBounds 设置为true 并运行应用程序来轻松确认这一点。取消按钮现在将不可见,因为工具栏之外的东西不再显示。


如果事件确实触发了,你的datePickerCancelled函数仍然不会任何事情:

func datePickerCancelled(){
    self.datePicker.resignFirstResponder();
}

您的日期选择器从来都不是第一响应者,因此该行不会导致任何事情发生。

也许你的意思是:

func datePickerCancelled(){
    self.dateField.resignFirstResponder();
}

【讨论】:

  • 感谢您的帮助。是的,我知道调试器,我在 self.dateField.resignFirstResponder() 上放了一个断点。它永远不会走那么远。这就是为什么我可以安全地提出这样的要求。
  • 同意。仍然没有回答我的问题,但你是对的。
  • 太棒了!那行得通。非常感谢。看你不必这么简洁。请记住,我们都是从某个地方开始的,对那些没有你经验丰富的人有点耐心可以走很长的路。
  • 我不同意。你问的问题很糟糕,并说“不似乎触发选择器”,好像你不确定。我认为我推动证据和确定性是完全正确的。此外,正如我还指出的那样,您的代码在任何情况下都不会起作用。如果我没有在这两点上回避,我们就不会得到正确的答案。这才是科学的方法。
  • 同意不同意。以后尽量避免使用感叹号。你表现得像个讨厌的混蛋。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多