首页 > 解决方案 > 有没有办法让当前未呈现的视图的第一响应者辞职?

问题描述

这是这种情况:

a 的根视图控制器UINavigationController有一个搜索栏。当用户搜索某些内容时,他们可以点击一个单元格,该单元格将一个新的视图控制器推送到带有一些信息的导航控制器上。发生这种情况时,预期的行为是让用户能够返回并仍然看到键盘打开,并且在搜索栏中填充了最新的搜索查询。

但是,还有一种情况,用户可能会点击一个标签栏,该标签栏应该从导航控制器中弹出除根控制器之外的所有视图控制器在这种情况下,我想在根控制器出现之前textField辞去 search bar的第一响应者。如果我尝试在 中执行此操作,则会失败。viewWillAppear(_:)resignFirstResponder()

这可能吗?我尝试过使用委托和通知,但似乎没有任何效果。

标签: iosswiftuikit

解决方案


正如@Sweeper 所说,endEditing为我工作,但resignFirstResponder没有。我执行viewWillAppear

import PlaygroundSupport
import UIKit


class ViewController: UIViewController {
    let button = UIButton()
    let searchBar = UISearchBar()

    override func viewDidLoad() {
        super.viewDidLoad()
        button.setTitle("Button", for: .normal)
        button.tag = 1
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        button.backgroundColor = .black
        self.view.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        
        self.navigationItem.titleView = searchBar
        
        NSLayoutConstraint.activate([
            button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
            button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            button.widthAnchor.constraint(equalToConstant: 200),
            button.heightAnchor.constraint(equalToConstant: 100),
        ])
        
    }
    
    @objc func buttonPressed(sender: UIButton) {
        if case let tag = sender.tag, tag == 1 {
            let secondVC = SecondVC()
            self.navigationController?.pushViewController(secondVC, animated: true)
        }
    }
}

class SecondVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .yellow
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.view.endEditing(true)
    }
    
}

let navVC = UINavigationController(rootViewController: ViewController())

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = navVC

推荐阅读