首页 > 解决方案 > 当 UITextView 辞职第一响应者时,导航栏项目不可点击

问题描述

我正在尝试在导航栏的右侧添加可点击按钮。UITextView当 a处于活动状态时(即存在键盘时),可以单击该按钮,但一旦关闭键盘,就不再可单击该按钮。代码是:

import UIKit

class DetailViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var textview: UITextView!
    let buttonDone = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(didClickDone))

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.rightBarButtonItem = buttonDone
        self.textview.becomeFirstResponder()
    }

    @objc func didClickDone() {
        print("Clicked on Done")
        self.textview.resignFirstResponder()
    }
}

因此,当UITextView是第一响应者时,单击“完成”按钮打印一条消息,并关闭键盘。

之后,无论我单击“完成”按钮多少次,都不会打印该消息。任何输入都非常感谢!


附加信息:

DetailViewController有一个嵌入在导航视图控制器中的列表视图控制器,如下所示:

在此处输入图像描述

下面是布局逻辑DetailViewController

在此处输入图像描述

列表视图控制器启用了手势识别器。不确定是否与此有关...手势识别器仅设置为长按。


更新1:我已经删除了方法中的textview.becomeFirstResponder()ViewDidLoad()。当我进入视图时,键盘没有按预期显示。在这种状态下,单击按钮不会打印消息...

所以我认为这不是他的错resignFirstResponder()...

更新2:我已经改成target: nil但是target: self 没用...

但是感谢所有的回复!任何进一步的帮助表示赞赏...

标签: iosswift

解决方案


在您的内部viewDidLoad,在那里创建UIBarButtonItem并分配它,而不是将其声明为类成员。

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didClickDone))
    self.textview.becomeFirstResponder()
}

推荐阅读