导航栏当UITextView重新响应第一个响应者时,项目无法单击

时间:2018-05-16 07:27:50

标签: ios swift

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

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具有嵌入导航视图控制器中的列表视图控制器,如下所示:

enter image description here

以下是DetailViewController

的布局逻辑

enter image description here

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

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

因此我认为这不是resignFirstResponder() ...

的错

更新2:我已将target: nil更改为target: self,但没有用...

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

2 个答案:

答案 0 :(得分:0)

请更新您的代码,如下所示

let buttonDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(didClickDone))

@@IBAction func didClickDone(sender:UIBarButtonItem) {
    print("Clicked on Done")
    self.textview.resignFirstResponder()
    self.view.endEditing(true)
}

答案 1 :(得分:0)

viewDidLoad内,创建UIBarButtonItem并将其分配到那里,而不是将其声明为类成员。

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