Ios 未触发UIBarButtonItem的操作

Ios 未触发UIBarButtonItem的操作,ios,swift,Ios,Swift,如果我把事情搞砸了,我会向你道歉。我已经对此进行了数小时的研究,并在stack exchange上阅读了其他帖子,但都无济于事 我创建了一个nib文件,它定义了一个自定义视图,并定义了一个自定义类(UIView)来管理自定义视图的输出。从下面摘自与nib关联的自定义UIView类的代码中可以看出,我有一个日期选择器作为自定义类的输入视图,还有一个带有两个UIBarButtonim的UIToolBar。通过点击手势识别器,这两个选项都会按需要显示。。。然而,问题是uibarbuttonims在点击

如果我把事情搞砸了,我会向你道歉。我已经对此进行了数小时的研究,并在stack exchange上阅读了其他帖子,但都无济于事

我创建了一个nib文件,它定义了一个自定义视图,并定义了一个自定义类(UIView)来管理自定义视图的输出。从下面摘自与nib关联的自定义UIView类的代码中可以看出,我有一个日期选择器作为自定义类的输入视图,还有一个带有两个UIBarButtonim的UIToolBar。通过点击手势识别器,这两个选项都会按需要显示。。。然而,问题是uibarbuttonims在点击时不调用操作。在action函数中放置断点表明代码从未运行过。我觉得视图生命周期中的某些东西阻止了引用,但我是Swift的新手,所以在此提供一些帮助将不胜感激。我认为这不是选择器语法,因为抽头手势识别器按需要工作。我尝试过处理按钮点击访问级别。我也尝试过在视图从nib唤醒时设置输入视图,同时尝试将代码放入生命周期的不同部分

如果出于生命周期的考虑,这个nib是表视图单元的一部分。我要求在table view单元格从其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
    }
}

我想点击手势识别器正在干扰本机uibarbuttonite点击事件。但是为什么要使用手势识别器呢


您最好为每个特定的UIBarButtonim添加一个操作。

您正在初始化没有框架的
UIToolbar
,这将使它不会注册任何触摸事件,因为它们超出了工具栏的范围

let accessoryView=UIToolbar()
替换为类似
let accessoryView=UIToolbar(帧:CGRect(x:0,y:0,宽度:view.bounds.width,高度:44))


或者您可以在
返回accessoryView

之前调用
accessoryView.sizeToFit()
尝试这行代码,但仍然没有解决问题:/@EdManning抱歉,请检查更新的答案。这将解决您的问题。非常感谢!手势识别器就是要让视图成为第一响应者,这样输入的视图就可以被显示出来。是否有更好的方法来设置此代码?是的,您可以使用view.becomeFirstResponder()来设置您想要关注的视图。更具体地说,我想代码应该用viewwillbeen编写,而不是viewDidLoad。但是你可以自己检查。但是我希望输入视图在用户点击视图时特别显示,而不是在加载或显示视图时。。。我不需要点击手势识别器来实现这一点吗?