【问题标题】:GestureRecognizer doesnt work dynamic/in extra class swiftGestureRecognizer 不能动态/在额外的类中快速工作
【发布时间】:2016-09-08 08:46:57
【问题描述】:

我想为每个 Viewcontroller 实现一个手势识别器。

以下代码正在运行:

class ViewController: UIViewController {
   func draggedView(sender:UIPanGestureRecognizer){
    // do stuff
   }

   override func viewDidLoad() {
     super.viewDidLoad()

     let panRec = UIPanGestureRecognizer()
     panRec.addTarget(self, action: #selector(ViewController.draggedView(_:)))
     self.view.addGestureRecognizer(panRec)
     self.view.userInteractionEnabled = true   
     }
}

现在我想给这个平移手势更动态/抽象一点

   class Tools : NSObject {

   var currentViewController: UIViewController? 

   func addPanToViewController(viewcontroller: UIViewController) {

    currentViewcontroller = viewcontroller

    if let currentViewcontroller = currentViewcontroller {
        let panRec = UIPanGestureRecognizer()
        panRec.addTarget(self, action: #selector(draggedView(_:)))
        currentViewcontroller.view.addGestureRecognizer(panRec)
        currentViewcontroller.view.userInteractionEnabled = true  
    } 

   }

 func draggedView(sender:UIPanGestureRecognizer) {
  //never called
 }
}

我这样调用 ViewController-Class 中的代码:

    let sidemenu = Tools()
    sidemenu.addPanToViewController(self)

但是什么也没发生。没有错误,但没有手势起作用。使用调试器,我看到添加了手势。所以每个代码都会被执行。

我想在我的 Tools 类中执行 draggedView。

我真的不明白我的问题在哪里?

【问题讨论】:

    标签: ios swift uiviewcontroller uigesturerecognizer


    【解决方案1】:

    我认为如果你想让它工作,你必须让 Tools 类变成单例:

    static let sharedInstance = Tools()

    然后在addPanToViewController:

    panRec.addTarget(Tools.sharedInstance, action:#selector(draggedView(_:)))

    在你的viewController:

    Tools.sharedInstance.addPanToViewController(self)

    【讨论】:

    • 对我不起作用。我不想在我的 Viewcontroller 中执行 draggedView。 draggedView 应该在 Tools 中执行
    • 是的,这段代码就是为此,我尝试使用 NStimer 选择器,它工作,检查编辑,我想我忘了删除一些代码,这将执行工具类中的draggedView 跨度>
    • 现在我明白了。您的代码正在运行。感谢那。你能解释一下为什么吗?在我的变体中,我对 viewcontroller 的引用似乎丢失了......或者?但为什么呢?
    【解决方案2】:
    currentViewcontroller.delegete = your gesturerecogniser delegate
    

    【讨论】:

    • 你能给我更多的信息吗?目前我没有使用代表。所以我必须在 mit ViewController 类中设置一个委托?什么样的代表?我应该在我的工具类中使用 UIGestureRecognizerDelegate 吗?
    • 是的。你必须调用 UIGestureRecognizerDelegate。然后你可以写 currentViewcontroller.delete = self
    • 但这是否会在 Viewcontroller 中执行 draggedView?
    • 你想在draggedView还是ViewController上做手势?
    • 在视图控制器上。问题是,对于一堆 Viewcontroller,draggedView 应该总是做同样的事情。它应该在 UIViewcontroller 上执行 UI 操作。
    猜你喜欢
    • 2016-03-21
    • 2014-10-22
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多