IOS Swift 4 UIView isHidden,带TapGestureRecognitor
我有个奇怪的问题 我用TabBarController制作了一个简单的单视图应用程序,在第一项(IOS Swift 4 UIView isHidden,带TapGestureRecognitor,ios,swift,uiview,uiviewcontroller,Ios,Swift,Uiview,Uiviewcontroller,我有个奇怪的问题 我用TabBarController制作了一个简单的单视图应用程序,在第一项(ViewController)中添加了子视图,并使用interface builder属性将它们隐藏起来 现在我想识别整个视图中的点击,使它们一个接一个地可见,并最终再次隐藏它们 将从界面生成器中放置手势识别器。所有插座均已正确连接并正常工作 无论如何,当我第一次点击时,UIViews不会显示,但是ishiden属性设置正确。我尝试了很多东西,搜索了很多东西,但在这个案例中没有任何真正的帮助。强制将所
ViewController
)中添加了子视图,并使用interface builder属性将它们隐藏起来
现在我想识别整个视图中的点击,使它们一个接一个地可见,并最终再次隐藏它们
将从界面生成器中放置手势识别器。所有插座均已正确连接并正常工作
无论如何,当我第一次点击时,UIView
s不会显示,但是ishiden
属性设置正确。我尝试了很多东西,搜索了很多东西,但在这个案例中没有任何真正的帮助。强制将所有内容包装到主线程中也没有帮助,在这种情况下也不会产生任何影响
这是我的代码:
//
// ViewController.swift
//
import UIKit
class ViewController: UIViewController {
var step = 0
@IBOutlet weak var firstViewOutlet: UIView! // properly connected
@IBOutlet weak var secondViewOutlet: UIView! // properly connected
@IBOutlet weak var thirdViewOutlet: UIView! // properly connected
@IBOutlet var tapRecognizer: UITapGestureRecognizer! // properly connected
override func viewDidLoad() {
super.viewDidLoad()
self.tapRecognizer.addTarget(self, action: #selector (self.tapAction(_:)))
print("viewDidLoad")
// Tried to hide them manually on load. Didn't work so I switched back to the interface builder property (checkbox)
// hideSubviews()
}
override func viewDidLayoutSubviews() {
print("viewDidLayoutSubviews")
}
@objc func tapAction(_ sender:UITapGestureRecognizer){
print("Tapped: \(self.step)") // Always works and shows the correct step value
switch self.step {
case 0:
print("Untap should show! \(self.step)") // Shows after first tap
DispatchQueue.main.async {
self.firstViewOutlet.isHidden = false
print("Value of first view state: \(self.firstViewOutlet.isHidden)") // shows false but visible after SECOND tap
self.step += 1
}
// Alternative doesn't change anything
// self.firstViewOutlet.isHidden = false
case 1:
print("Upkeep should show! \(self.step)") // Shows second first tap
DispatchQueue.main.async {
self.secondViewOutlet.isHidden = false
print("Value of second view state: \(self.secondViewOutlet.isHidden)") // shows false but visible after THIRD tap
self.step += 1
}
// Alternative doesn't change anything
// self.secondViewOutlet.isHidden = false
case 2:
print("Draw should show! \(self.step)") // Shows after third tap
DispatchQueue.main.async {
self.thirdViewOutlet.isHidden = false
print("Value of third view state: \(self.thirdViewOutlet.isHidden)") // shows false but visible after FOURTH tap
self.step += 1
}
// Alternative doesn't change anything
// self.thirdViewOutlet.isHidden = true
case 3:
print("Draw should clear! \(self.step)")
hideSubviews() // works after FIFTH tap
// Alternative doesn't change anything
// self.firstViewOutlet.isHidden = true
// self.secondViewOutlet.isHidden = true
// self.thirdViewOutlet.isHidden = true
// self.step = 0
default:
return
}
}
func hideSubviews(){
DispatchQueue.main.async {
self.thirdViewOutlet.isHidden = true
self.firstViewOutlet.isHidden = true
self.secondViewOutlet.isHidden = true
self.step = 0
}
}
}
有趣的是,在第一次演讲后,一切都很顺利。
我甚至尝试将view.layoutifneed()
,view.layoutSubviews()
,view.setNeedsDisplay()
和view.setNeedsLayout()
添加到插座和self.view
,但它也没有改变任何东西
如有任何建议,我们将不胜感激。我打赌这是一只我看不见的又小又笨的虫子
这似乎是任何用户界面的变化。即使在第一次点击时更改标签颜色也不起作用
复制步骤:
- 创建新项目(单视图应用程序)
- 单击视图控制器、编辑器->嵌入->点击栏控制器
- 单击库图标,将容器视图拖动到ViewController
- 在Interface Builder中将此容器视图的[hidden]属性设置为true
- 创建从容器视图到ViewController的出口
- 单击库图标,将轻触手势识别器拖动到ViewController(而不是容器视图!)
- 创建从容器视图到ViewController的出口
- 复制我的代码或从头开始编写
为什么在这里使用DispatchQueue.main.async
?你想让它做什么,仅仅设置值不起作用?正如我在帖子中提到的,直接设置也不起作用。我在一个新项目中实现了上面的代码,其中viewController嵌入到UITabBarController中,我无法重现您的结果。第一次点击时会出现第一个视图,依此类推。这很奇怪。我会尝试一个新的项目,并更新,如果它也工作。奇怪…我创建了一个新项目,一切从头开始。同样的行为。