未触发UIBarButtonItem的操作

时间:2017-07-24 11:40:53

标签: ios swift

如果我搞砸了,那么第一篇文章如此道歉。我已经研究了几个小时,并在堆栈交换中阅读其他帖子无济于事。

我创建了一个定义自定义视图的nib文件,并定义了一个自定义类(UIView)来管理自定义视图的出口。从我从与nib关联的自定义UIView类摘录的下面的代码中可以看到,我有一个日期选择器作为自定义类的输入视图和一个带有两个UIBarButtonItem的UIToolBar。这两个都通过点击手势识别器显示出来......但问题是UIBarButtonItems在点击时不会调用该操作。在操作函数中放置断点会显示代码永远不会运行。我觉得视图生命周期中的某些内容阻止了引用,但我是Swift的新手,所以在这里提供一些帮助将不胜感激。我认为它不是选择器语法,因为轻敲手势识别器可以按需运行。我已经尝试搞乱按钮点击处理访问级别。当视图从nib唤醒时,我尝试进行输入视图设置,同时尝试将代码放在生命周期的不同部分。

如果生命周期很重要,这个笔尖是表格视图单元格的一部分。当表视图单元格从它的笔尖中醒来时,我调用了这个nib。

谢谢!

@IBOutlet weak var timerStackView: UIStackView!{
    didSet{
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(HandleTap(_:)))
        timerStackView.addGestureRecognizer(tapGesture)
    }
}

var datePicker: UIDatePicker {
    let picker = UIDatePicker()
    picker.backgroundColor = UIColor.black
    picker.isOpaque = false
    picker.setValue(UIColor.white, forKey: "textColor")
    return picker
}

var datePickerAccessoryView: UIToolbar {
    let accessoryView = UIToolbar()
    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(handleDatePickerButtonClick(_:)))
    doneButton.tintColor = UIColor.white
    let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(handleDatePickerButtonClick(_:)))
    cancelButton.tintColor = UIColor.white
    accessoryView.setItems([cancelButton, doneButton], animated: true)
    return accessoryView
}

override var inputView: UIView? {return datePicker}
override var inputAccessoryView: UIView? {return datePickerAccessoryView}
override var canBecomeFirstResponder: Bool {return true}
override var canResignFirstResponder: Bool {return true}

// MARK: - Private functions
@objc fileprivate func HandleTap(_ sender: UITapGestureRecognizer) -> Void {
    if !self.isFirstResponder {
        switch sender.state {
        case .ended:
            datePicker.date = Date()
            self.becomeFirstResponder()
        default:
            break
        }
    }
}

@objc @IBAction internal func handleDatePickerButtonClick(_ sender: UIBarButtonItem) -> Void {
    switch sender.title! {
    case "Done":
        // To be implemented
    case "Cancel":
        // To be implemented
    default:
        break
    }
}

2 个答案:

答案 0 :(得分:1)

我认为点击手势识别器正在干扰本机UIBarButtonItem点击事件。但为什么你会使用手势识别器?

您最好为每个特定的UIBarButtonItem添加一个动作。

答案 1 :(得分:1)

你正在初始化没有框架的UIToolbar,这会使它没有注册任何触摸事件,因为它们将超出工具栏的界限。

let accessoryView = UIToolbar()替换为let accessoryView = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 44))

或者您可以在accessoryView.sizeToFit()

之前致电return accessoryView