IOS Swift 4 UIView isHidden,带TapGestureRecognitor

IOS Swift 4 UIView isHidden,带TapGestureRecognitor,ios,swift,uiview,uiviewcontroller,Ios,Swift,Uiview,Uiviewcontroller,我有个奇怪的问题 我用TabBarController制作了一个简单的单视图应用程序,在第一项(ViewController)中添加了子视图,并使用interface builder属性将它们隐藏起来 现在我想识别整个视图中的点击,使它们一个接一个地可见,并最终再次隐藏它们 将从界面生成器中放置手势识别器。所有插座均已正确连接并正常工作 无论如何,当我第一次点击时,UIViews不会显示,但是ishiden属性设置正确。我尝试了很多东西,搜索了很多东西,但在这个案例中没有任何真正的帮助。强制将所

我有个奇怪的问题

我用TabBarController制作了一个简单的单视图应用程序,在第一项(
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中,我无法重现您的结果。第一次点击时会出现第一个视图,依此类推。这很奇怪。我会尝试一个新的项目,并更新,如果它也工作。奇怪…我创建了一个新项目,一切从头开始。同样的行为。