UITapGestureRecognizer 未触发
UITapGestureRecognizer not firing
让我们把 google 结果排除在外
- .userInteractionEnabled 为真
- 视图已命中(使用
-[UIWindow sendEvent:]
和 po $arg3
的符号断点)
现在谈谈我是如何构建这个结构的,这是一种尝试使模型完全从视图代码中删除的尝试。
要点是我有这些 classes:
- class
CarModel
- 纯数据
- class
CarModelDisplayClass
- 携带模型的class,可以符合Displayable
和Tappable
。这就是后面BuilderClass要处理的class,它基本上充当了Models和Views之间的桥梁。
- 协议
Displayable
- 为 class return 创建一个视图,以便后面的 BuilderClass 附加到 view/screen
- 协议
Tappable
- BuilderClass 查看一致性以将点击手势附加到视图(return 来自 Displayable
协议))
Builder 是这样工作的:
- 硬编码构建一堆 CarModels
- 用模型硬编码构建一堆 CarModelDisplayClass
- 将 CarModelDisplayClass 列表发送到将列表转换为实际视图和手势识别器的方法(通过查看协议一致性)
- 将这些视图附加到实际的 UIViewController
- 呈现 UIViewController
此时一切正常,除了 UITapGestureRecognizer。
CarModelDisplayClass
实际视图+手势看起来像这样。
for item in items {
let view = item.view() // Get the view from the Displayable protocol
superView.addSubview(view)
if let i = item as? Tappable { // Check Tappable conformance
let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
view.addGestureRecognizer(gesture)
view.isUserInteractionEnabled = true
}
}
我不确定我是否遗漏了一些明显的东西。我认为可能与目标 i
相关的问题是问题所在,但我也尝试将其定向到 item
(我不知道这是否重要)。
任何指点都会有所帮助。
我这里有真正的代码(虽然名称不同)
- The Displayable and Tappable protocols
- Pure model class
- Example of a display class that takes a model and conforms to display to return a simple label, and conforms to tappable with a method
- The view builder that converts display classes into actual views and adds gesture recognizers to them if needed
- The high level builder that collects models, display classes and presents a VC
看来您必须在代码中的某处保留对可点击项的强引用,否则它们将从内存中删除。
根据附加链接中的代码 - 我会将 TLAStackviewBuilder class 更改为 return UIScrollView,但其中包含对 displayRows 的引用。
在您上面编写的代码中:
class Something {
let storedItems: [Any]!
func someFunc(items: Tappable) {
storedItems = items
for item in items {
let view = item.view() // Get the view from the Displayable protocol
superView.addSubview(view)
if let i = item as? Tappable { // Check Tappable conformance
let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
view.addGestureRecognizer(gesture)
view.isUserInteractionEnabled = true
}
}
}
}
让我们把 google 结果排除在外
- .userInteractionEnabled 为真
- 视图已命中(使用
-[UIWindow sendEvent:]
和po $arg3
的符号断点)
现在谈谈我是如何构建这个结构的,这是一种尝试使模型完全从视图代码中删除的尝试。
要点是我有这些 classes:
- class
CarModel
- 纯数据 - class
CarModelDisplayClass
- 携带模型的class,可以符合Displayable
和Tappable
。这就是后面BuilderClass要处理的class,它基本上充当了Models和Views之间的桥梁。 - 协议
Displayable
- 为 class return 创建一个视图,以便后面的 BuilderClass 附加到 view/screen - 协议
Tappable
- BuilderClass 查看一致性以将点击手势附加到视图(return 来自Displayable
协议))
Builder 是这样工作的:
- 硬编码构建一堆 CarModels
- 用模型硬编码构建一堆 CarModelDisplayClass
- 将 CarModelDisplayClass 列表发送到将列表转换为实际视图和手势识别器的方法(通过查看协议一致性)
- 将这些视图附加到实际的 UIViewController
- 呈现 UIViewController
此时一切正常,除了 UITapGestureRecognizer。
CarModelDisplayClass
实际视图+手势看起来像这样。
for item in items {
let view = item.view() // Get the view from the Displayable protocol
superView.addSubview(view)
if let i = item as? Tappable { // Check Tappable conformance
let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
view.addGestureRecognizer(gesture)
view.isUserInteractionEnabled = true
}
}
我不确定我是否遗漏了一些明显的东西。我认为可能与目标 i
相关的问题是问题所在,但我也尝试将其定向到 item
(我不知道这是否重要)。
任何指点都会有所帮助。
我这里有真正的代码(虽然名称不同)
- The Displayable and Tappable protocols
- Pure model class
- Example of a display class that takes a model and conforms to display to return a simple label, and conforms to tappable with a method
- The view builder that converts display classes into actual views and adds gesture recognizers to them if needed
- The high level builder that collects models, display classes and presents a VC
看来您必须在代码中的某处保留对可点击项的强引用,否则它们将从内存中删除。
根据附加链接中的代码 - 我会将 TLAStackviewBuilder class 更改为 return UIScrollView,但其中包含对 displayRows 的引用。
在您上面编写的代码中:
class Something {
let storedItems: [Any]!
func someFunc(items: Tappable) {
storedItems = items
for item in items {
let view = item.view() // Get the view from the Displayable protocol
superView.addSubview(view)
if let i = item as? Tappable { // Check Tappable conformance
let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
view.addGestureRecognizer(gesture)
view.isUserInteractionEnabled = true
}
}
}
}