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)
否则你将 运行 进入这个问题。
我的配置非常简单。 有 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)
否则你将 运行 进入这个问题。