Ios 使用swift为自定义控件指定两个不同的UITapgestureRecognitor

Ios 使用swift为自定义控件指定两个不同的UITapgestureRecognitor,ios,swift,swift4,uitapgesturerecognizer,Ios,Swift,Swift4,Uitapgesturerecognizer,使用swift,我试图创建一个动态的通用控件来重用它,基本上,控件内部应该有一个通用的行为 更具体地说,我有一个uicrollview,它是用UIViews填充的,当你点击UIView时,背景应该会改变。 这是正确的 但是,对于实现,我的泛型控件类接受一个选择器作为参数 两者都是分开工作的,但一起工作是不起作用的 代码的具体部分是: 通用类 let clickAgendaEvent = UITapGestureRecognizer(target: self, action: #selector

使用swift,我试图创建一个动态的通用控件来重用它,基本上,控件内部应该有一个通用的行为

更具体地说,我有一个
uicrollview
,它是用
UIViews
填充的,当你点击
UIView
时,背景应该会改变。 这是正确的

但是,对于实现,我的泛型控件类接受一个
选择器
作为参数

两者都是分开工作的,但一起工作是不起作用的

代码的具体部分是:

通用类

let clickAgendaEvent = UITapGestureRecognizer(target: self, action:  #selector (self.agendaClicked (_:)))
cellSubView.addGestureRecognizer(clickAgendaEvent)
cell.addSubview(cellSubView)

let itemClickedEvent = UITapGestureRecognizer(target: viewController.self, action: self.agendaItemClicked!  )
cell.addGestureRecognizer(itemClickedEvent)
以及具有如下实现的
ViewController

@objc func eventDailyAgenda(sender:UIView!){
        print("Item clicked!")
    }
如您所见,第二个事件不在泛型类中,如果
ViewController
,则第二个事件是一个单独的实现。 但是,泛型类将为其他
UIViewController
实现


有人知道如何处理它吗?

查看
UIgestureRecognitizerDelegate
以同时处理这两种手势。请查看回调
手势识别器(:shouldlrecognizesimultaneouslywith:)
。返回true以同时处理两个手势。

查看
UIgestureRecognitizerDelegate
以同时处理两个手势。请查看回调
手势识别器(:shouldlrecognizesimultaneouslywith:)
。返回true以同时处理这两个问题。

更简单的方法是实现
UIgestureRecognitizerDelegate
。 但是对于我的具体案例,没有起作用,因为我有不同的类来实现这个行为

但是,我找到了一种方法。 并且正在实现
NSObject
(如果您在
UIViewController
中,则不必实现它

就我的情况而言,我有自己的课程:

class MyClass:NSObject {

    func createAll(){
        let clickAgendaEvent = UITapGestureRecognizer(target: self, action:  #selector (self.agendaClicked (_:)))
        cellSubView.addGestureRecognizer(clickAgendaEvent)
        cellSubView.tag = index
        cell.addSubview(cellSubView)
    }

        @objc func agendaClicked(_ sender:AnyObject) {
            baseView.setTransparentToSubViews()
            print("Here")

            let tap = sender as! UITapGestureRecognizer
            tap.view?.backgroundColor = UIColor().hexStringToUIColor(hex: "#e0e0e0")

            if let v = tap.view {
                // use button
                print("The tag is \(v.tag)")
            }


            if let c: NSObject.Type = NSClassFromString(viewController.className) as? NSObject.Type{
                let c_tmp = c.init()
                    c_tmp.perform(Selector(("test")))
                        c.perform(Selector(("static_test")))
        }
    }

}
添加您的
ViewController

@objc public func test(){
        print("This is Test!!!")
    }
    @objc public class func static_test(){
        print("This is Static Test")
    }
这个扩展:

import Foundation
import UIKit

extension UIViewController {
    var className: String {
        return NSStringFromClass(self.classForCoder)
    }
}
现在,您可以执行所需的所有方法

在这种情况下,一旦用户触摸一个元素,下一个事件将从该触摸触发,并且不需要添加新的代理


也许不是更好的方法,但完全是功能性的。

更简单的方法是实现
UIgestureRecognitizerDelegate
。 但是对于我的具体案例,没有起作用,因为我有不同的类来实现这个行为

但是,我找到了一种方法。 并且正在实现
NSObject
(如果您在
UIViewController
中,则不必实现它

就我的情况而言,我有自己的课程:

class MyClass:NSObject {

    func createAll(){
        let clickAgendaEvent = UITapGestureRecognizer(target: self, action:  #selector (self.agendaClicked (_:)))
        cellSubView.addGestureRecognizer(clickAgendaEvent)
        cellSubView.tag = index
        cell.addSubview(cellSubView)
    }

        @objc func agendaClicked(_ sender:AnyObject) {
            baseView.setTransparentToSubViews()
            print("Here")

            let tap = sender as! UITapGestureRecognizer
            tap.view?.backgroundColor = UIColor().hexStringToUIColor(hex: "#e0e0e0")

            if let v = tap.view {
                // use button
                print("The tag is \(v.tag)")
            }


            if let c: NSObject.Type = NSClassFromString(viewController.className) as? NSObject.Type{
                let c_tmp = c.init()
                    c_tmp.perform(Selector(("test")))
                        c.perform(Selector(("static_test")))
        }
    }

}
添加您的
ViewController

@objc public func test(){
        print("This is Test!!!")
    }
    @objc public class func static_test(){
        print("This is Static Test")
    }
这个扩展:

import Foundation
import UIKit

extension UIViewController {
    var className: String {
        return NSStringFromClass(self.classForCoder)
    }
}
现在,您可以执行所需的所有方法

在这种情况下,一旦用户触摸一个元素,下一个事件将从该触摸触发,并且不需要添加新的代理


也许不是更好的方法,但完全是功能性的。

我认为您必须实现GestureDelegate,并为手势同时工作返回yes
扩展视图控制器:UIGestureRecognitizerDelegate{public func GestureRecognitizer(gestureRecognitizer:UIgestureRecognitizer,应与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
我添加了它,但仍然没有启动两个。如果您在一个视图中添加一个手势,在另一个视图中添加另一个手势,我认为最前面的视图应该将事件传递到背景视图,或者将两个手势都添加到最前面的视图,并且仅将第二个手势添加到背景视图,我不知道您是否理解我说的话是的,我尝试过,但两者都可以在同一个
IUView
组件中添加,第一个组件被激发,但第二个组件不被激发我认为您必须实现GestureDelegate并为手势同时工作返回yes
extension ViewController:UIGestureRecognitizerDelegate{public func GestureRecognitizer(gestureRecognitizer:UIgestureRecognitizer,应与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
我添加了它,但仍然没有启动两个。如果您在一个视图中添加一个手势,在另一个视图中添加另一个手势,我认为最前面的视图应该将事件传递到背景视图,或者将两个手势都添加到最前面的视图,并且仅将第二个手势添加到背景视图,我不知道您是否理解我说的话是的,我尝试过,但两者都可以在同一个
IUView
组件中添加,第一个被激发,但第二个没有。我刚刚添加了函数
func gestureRecognitizer(gestureRecognitizer:uigestureRecognitizer,应该与其他gestureRecognitizer:uigestureRecognitizer同时识别)->Bool{return true}
并实现了
UIgestureRecognitizerDelegate
,但现在仍在调用这两个代理。对于我的具体情况,我应该创建一个平移手势来分配它吗?我刚刚添加了函数
func gestureRecognitizer(\ugestureRecognitizer:UIgestureRecognitizer,应该与其他gestureRecognitizer:UIgestureRecognitizer同时识别)->Bool{return true}
和implemented
UIgestureRecognitizerDelegate
但是,现在仍在调用两者。对于我的特定情况,我应该创建一个平移手势来分配它吗?