UIButton 操作未触发 ViewController 以模态方式呈现

UIButton action not triggering on ViewController that is presented modally

我的配置非常简单。 有 MainController,它将呈现 NewController。一旦 NewController 出现,整个 UI 加载。有些在 UIScrollView 中,有些是静态的。我在导航栏中有几个 UIButtons 和一个 UIBarButtonItem。 UIBarButtonItem 按预期运行。但是,我的 UI 按钮没有任何作用。如果你按住它们,它们会突出显示,但 touchUpInside 事件似乎没有调用我的 @Objc 方法。

我不明白的是,在某一时刻,我按下了 NewController 而不是呈现,并且 UIButtons 工作正常。既然呈现出来了,还是不行。

根据我对这个问题的研究,由于 NewController 的多个实例,按钮被按下两次似乎很常见。不过对我来说不是这样。

MainController呈现方式:

let newController = NewController()
let navController = UINavigationController(rootViewController: newController)
navController.modalPresentationStyle = .popover
self.present(navController, animated: true, completion: nil)

我的 UIButton 及其在 NewController 中的方法:

static let star: UIButton = {
    let btn = UIButton()
    btn.setImage(UIImage(systemName: "star"), for: .normal)
    btn.setImage(UIImage(systemName: "star.fill"), for: .selected)
    btn.setTitle("  Add to Favorites", for: .normal)
    btn.setTitle("  Remove from Favorites", for: .selected)
    btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
    btn.setTitleColor(UIColor.white, for: [.normal, .selected])
    btn.setTitleColor(UIColor.r6whiteAlpha(), for: [.highlighted, .focused])
    btn.tintColor = .white
    btn.addTarget(self, action: #selector(starTapped), for: .touchUpInside)
    return btn
}()

@objc func starTapped() {
    print("star tapped") // Nothing prints to console.
}

我应该提到的是我遇到问题的所有 UI 按钮都是静态变量。它们也都在 UIScrollView 中。

更新:我改变了我的代码以强制只有一个 NewController 实例存在并消除了对静态变量的需要,但它没有改变任何东西。

好吧,我又花了几个小时。经过无数次尝试和审查我的代码,我发现了问题,而且非常奇怪。

在 MainController 上,我有一个 UITextField。一旦按下 return 键,它就会显示 NewController。键盘关闭并出现。我在演示前没有打电话给 textField.endEditing(true),这似乎由于某种原因导致了我的问题。

解决方法: 如果你有一个 UITextField 作为第一响应者,你必须在模态呈现另一个 ViewController 之前调用 endEditing(true) 否则你将 运行 进入这个问题。