【发布时间】:2018-02-04 18:12:39
【问题描述】:
我最近在 iOS 11 中测试了我的应用,但由于某种原因,我无法在动态填充的表格视图中选择前 12 行之一。甚至没有为这些行触发 didSelectRow。其他行工作正常,但即使向下和向上滚动(到那时单元格应该已经被再次使用)前 12 行也不起作用。
即使在静态表格视图上,当切换到该视图控制器时出现在屏幕上的所有单元格都不会响应,它们内部的控件也不会响应,即使它们位于不同的部分。最初不在屏幕上的单元格再次正常工作。
我将尝试在具有样板代码的应用中对此进行测试,但这是一个已知错误吗?我在网上找不到任何关于它的信息。
我在将设备更新到 iOS 11 之后测试了这一点,然后在没有更改代码的情况下从 Xcode 9 beta 6 再次进行了测试,并在迁移到 Swift 4 之后再次进行了测试。模拟器中的行为相同。直到 iOS 10 一切都很好,只有 iOS 11 才会出现问题。
这将在两周内为用户破坏我的应用程序,我需要修复它,因此非常感谢任何帮助或建议!
更新: 正如 Paulw11 所建议的,确实有另一个视图阻塞了这些行。这是值得注意的,因为第 12 行只能在单元格的下部选择,而不能在上部选择。
这个问题的原因是以下代码:
extension UIViewController {
func setBackgroundImage(forTableView tableView: UITableView) {
let bgImage = UIImage(named: "Background Image.png")
let bgImageView = UIImageView(image: bgImage)
tableView.backgroundView = bgImageView
let rect = bgImageView.bounds
let effect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurView = UIVisualEffectView(effect: effect)
let height: CGFloat
switch screenSize.height {
case 480, 568: height = 455
case 736: height = 623
default: height = 554
}
blurView.frame = CGRect(x: 0, y: 0, width: rect.width, height: height)
let container = UIView(frame: rect)
bgImageView.addSubview(blurView)
let bgOverlay = UIImage(named: "Background Overlay.png")
let bgOverlayImageView = UIImageView(image: bgOverlay)
bgOverlayImageView.alpha = 0.15
bgImageView.addSubview(bgOverlayImageView)
self.view.insertSubview(container, at: 1)
}
}
不知何故,自 iOS 11 以来,此背景图像似乎呈现在单元格前面。不将容器视图插入表视图的视图将解决该问题。我试过设置容器层的 zPosition 但它没有帮助。如何再次将背景图像移动到单元格后面。 奇怪的是,这种行为会从 iOS 10 更改为 11...
更新 2: 在索引 -1 处插入容器可解决问题:
self.view.insertSubview(container, at: -1)
但我不明白为什么会这样,这个索引不应该超出范围吗?
更新 3: 正如 Paulw11 在下面指出的那样,容器完全没用,它是从测试中遗留下来的,删除它可以解决问题。
【问题讨论】:
-
检查您的视图层次结构;我的猜测是你有一个错误的视图,它阻止了选择那些第一行,但这只是一个猜测,因为你没有做太多的事情。如果你能创建一个minimal reproducible example 会有所帮助
-
感谢您的帮助,我将创建一个示例。奇怪的是,它在 iOS 11 之前运行良好,没有任何更改,因此没有任何视图阻塞行。
-
事实证明你是对的,请看我的更新 Paulw11!
-
container视图的目的是什么?它似乎没有任何东西 -
伙计,你让我明白了。该容器是测试的剩余物,它不应该再存在了。它曾经包含 bgImageView 和另一个视图。如果您可以将此作为答案发布,我可以接受。非常感谢!
标签: ios iphone xcode uitableview ios11