【问题标题】:Action not being triggered for UIBarButtonItem没有为 UIBarButtonItem 触发操作
【发布时间】:2023-03-14 13:18:01
【问题描述】:

如果我搞砸了,第一次发帖很抱歉。我已经研究了几个小时,并在这里阅读了堆栈交换上的其他帖子,但无济于事。

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

如果它对生命周期很重要,则此笔尖是表格视图单元格的一部分。当表格视图单元格从它的笔尖唤醒时,我要求加载这个笔尖。

谢谢!

@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
    }
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

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

    或者你可以在return accessoryView之前拨打accessoryView.sizeToFit()

    【讨论】:

    • 试过这行代码,还是没有解决问题:/
    • @EdManning 抱歉,请查看更新后的答案。这应该可以解决您的问题。
    • 非常感谢!这样做了。
    【解决方案2】:

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

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

    【讨论】:

    • 手势识别器是让视图成为第一响应者,这样输入的视图就可以变得可见。有没有更好的方法来设置此代码?
    • 是的,您可以将 view.becomeFirstResponder() 用于您想要关注的视图。更具体地说,我猜代码应该写在 viewWillAppear 中,而不是 viewDidLoad 中。不过你可以自己查。
    • 但是我希望输入视图在用户点击视图时特别出现,而不是在视图加载或出现时...我不需要点击手势识别器来实现这一点吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多