检查用户是不是点击了外部视图控制器

Posted

技术标签:

【中文标题】检查用户是不是点击了外部视图控制器【英文标题】:check if user clicked outside view controller检查用户是否点击了外部视图控制器 【发布时间】:2017-10-04 18:31:38 【问题描述】:

我正在为 macOS 使用 swift 4,如果我在此视图控制器之外单击,我想关闭视图控制器。

通过这段代码,我可以检查用户是否点击了视图控制器。但是如何检查用户是否在视图控制器外部单击?

override func viewDidAppear() 
   let gesture = NSClickGestureRecognizer(target: self, action: #selector(clicked))
   gesture.buttonMask = 0x1 // left mouse
   gesture.numberOfClicksRequired = 1
   self.view.addGestureRecognizer(gesture)



@objc func clicked() 
   print("Hello world")

【问题讨论】:

您是指在您的应用窗口内或完全在应用外的不同视图? 一个将显示为工作表的视图控制器。如果我在此工作表视图控制器之外单击,我想关闭此工作表视图控制器 @PhillipMills 我建议它应该在应用程序内 在应用内是的 视图控制器不是界面元素,那么“点击外部视图控制器”是什么意思呢? 【参考方案1】:

NSEvent 有一个方法叫...

+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent * _Nullable (^)(NSEvent *))block;

...在分派事件之前捕获事件。

要求监视鼠标向上或鼠标向下事件,并使用块将坐标与视图的边界进行比较。

编辑:

除了,在 Swift 中,它被称为...

class func addLocalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> NSEvent?) -> Any?

【讨论】:

【参考方案2】:

我会使用 touchesEnded: 然后使用事件来获取 locationInWindow。如果该位置超出您的视野范围,则将其关闭。可以在此处查看 ios 的类似问题。

IOS - How to hide a view by touching anywhere outside of it

我总是更喜欢touchedEnded,因为如果用户不小心点击了外部,他们仍然可以拖动到视图以取消关闭。

【讨论】:

需要 OSX 解决方案 这就是为什么我说使用 touchesBegan/touchesEnded 并检查为 locationInWindow 变量传入的 NSEvent...

以上是关于检查用户是不是点击了外部视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

XCTest:如何检查异步元素是不是存在

如何检查子视图控制器是不是存在

如何检查用户是不是可以看到视图[重复]

如何检查 url 是不是指向外部角度应用程序

检查用户是不是点击了 Facebook Like 按钮(多个按钮)

检查保存到相机胶卷是否成功