如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView

Posted

技术标签:

【中文标题】如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView【英文标题】:How to remove popView if we tap anywhere in the background except tapping in popView in swift 【发布时间】:2019-11-13 11:10:05 【问题描述】:

我在 ViewController 中创建了一个带有文本字段和按钮的 popView。如果我点击按钮然后popView出现,我可以在文本字段中输入文本并提交工作,如果我点击视图中的任何地方我也可以删除popView,但是如果我点击popView中的任何地方我想要不想关闭 popView,请在代码中帮助我。

这是我的代码:

 import UIKit

 class PopUPViewController: UIViewController 

@IBOutlet weak var popView: UIView!
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad() 
    super.viewDidLoad()
    popView.isHidden = true
    // Do any additional setup after loading the view.


@IBAction func butnAct(_ sender: Any) 
    view?.backgroundColor = UIColor(white: 1, alpha: 0.9)
    popView.isHidden = false
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PopUPViewController.dismissView))
    view.addGestureRecognizer(tap)


@objc func dismissView() 
    self.popView.isHidden = true
    view?.backgroundColor = .white


@IBAction func sendButton(_ sender: Any) 
    self.textLabel.text = inputField.text


在我的代码中,如果我点击视图中的任何位置,popView 正在移除,即使我点击 popView 也将其移除,我不需要这样做,如果我点击 popView,则 popView 不需要被移除。

请帮我写代码

【问题讨论】:

【参考方案1】:

new touchviewwindowdetected 时,您可以override touchesBegan 方法triggered。通过使用这个method,您可以检查特定的view 是否被触摸。

这样试试

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
     let touch = touches.first
     if touch?.view != self.popView 
        dismissView()
    


func dismissView() 
    self.popView.isHidden = true
    view?.backgroundColor = .white

【讨论】:

【参考方案2】:

这不是我设计的方式,但要解决您面临的问题,您需要调整您的 dismissView 方法,以便它仅在点击位于 popView 之外时关闭视图。

为此,请修改您的选择器以将发件人(UITapGestureRecogniser)作为参数包含:

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PopUPViewController.dismissView(_:)))

然后在您的函数中接受该参数并测试点击是否在您的视图内,如果是,请不要关闭视图:

@objc func dismissView(_ sender: UITapGestureRegognizer) 
  let tapPoint = sender.location(in: self.popView)
  if self.popView.point(inside: tapPoint, with: nil)) == false 
    self.popView.isHidden = true
    view?.backgroundColor = .white
  


【讨论】:

【参考方案3】:

您的 Popup 视图位于 viewcontroller 的父视图内,这就是为什么点击 popview 时您的 popview 也会被隐藏。 因此,为了避免只在后台添加一个视图并将其命名为 bgView 或任何您想要的名称,并将其替换为视图。它会正常工作。

代码:

@IBOutlet weak var bgView: UIView!//Add this new outlet
@IBOutlet weak var popView: UIView!
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var textLabel: UILabel!
@IBOutlet weak var submitButton: UIButton!
override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    popView.isHidden = true





@IBAction func butnAct(_ sender: Any) 
    bgView.backgroundColor = UIColor(white: 1, alpha: 0.9)//change view to bgView[![enter image description here][1]][1]
    popView.isHidden = false
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.dismissView))
    bgView.addGestureRecognizer(tap)//change view to bgView


@objc func dismissView() 
    self.popView.isHidden = true
    bgView.backgroundColor = .white//change view to bgView


@IBAction func sendButton(_ sender: Any) 
    self.textLabel.text = inputField.text

【讨论】:

感谢兄弟第一个答案解决了我的问题..但感谢您的详细回答

以上是关于如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView的主要内容,如果未能解决你的问题,请参考以下文章

在用户点击它们之前在后台处理通知 - Swift 3

swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)

Swift 后台通知 Firebase

在后台点击 Swift 时禁用关闭弹出框

在 swift 中,如何在应用程序委托中实现一个变量,以便在应用程序的任何地方检索它?

在 Swift 中的应用程序中的任何地方运行一个函数 N 次