TapGesture添加到UIView + SomeCategory。如何使用添加到我的UIViewController的UIView?

时间:2015-05-02 05:45:27

标签: ios objective-c uiview uiviewcontroller objective-c-category

我有一个定制的UIView。我在这个UIView中添加了一个tapGestureRecognizer。不是通过UIViewController,而是在UIView + Category类中。我点击了这个UIView时尝试使用presentViewController()。这是一个UIView类,它不允许presentViewController()。我知道只有UIViewController允许调用此函数。我错误地构建了我的项目吗?如果我只是将tapGestureRecognizer添加到这个UIView而不是使用类别但是直接从UIViewController中添加它会更好吗?这个UIView将在其他地方使用,所以如果我能够实现这一点,它将为我节省大量代码。提前谢谢。

4 个答案:

答案 0 :(得分:1)

您正在从错误的角度接近问题。在代码中实现MVC, or Model-View-Controller模式时,遵循良好的标准非常重要。将UIViews视为应该只管理视图布局代码的愚蠢对象(有时候它也是自己的自定义动画)。它们不应该管理ViewController逻辑,因为ViewController逻辑超出了它们的范围。他们是愚蠢的,不知道任何与视图无关的知识。

更好的方法来做你想要的是创建一个UIViewController子类来管理你的视图的点击手势(你可以在viewDidLoad下添加点击手势识别器)。然后在需要时从其他视图控制器继承此ViewController。

希望这有帮助。

答案 1 :(得分:1)

function solution(A) { if (isArraySorted(A)) return true; for (var i = 0; i < A.length; i++) //if not sorted lets check { for (var j = i + 1; j < A.length; j++) { if (A[i] > A[j]) //swap only if A[i] > A[j] { var temp = A[i]; A[i] = A[j]; A[j] = temp; return isArraySorted(A); // after one swap check if it's sorted and return that value. } } } } ,您必须需要presentViewController()个对象。我想建议您,您可以将UIViewController声明为Apple提供的UIView。表示您可以创建一个UITableView类,并在该类中添加UIViewUITapGesture。和Delegate这个类在哪里你需要像type cast(它可能来自故事板或编程)。

现在在该创建的类中声明一个UITableView方法。并在需要时将此方法定义为当前Delegate。所以现在发生了什么,当你点击UIViewController时,它会调用UIView方法。在该选择器方法中,借助UITapGesture selector方法响应转移到当前delegate类。

现在你可以从当前班级UIViewController

因此,在整个场景中,您只需在当前类中定义presentUIViewController()方法,而无需在不同类中编写相同代码的次数。这与Apple为Delegate提供的流程相同。

uiview-tutorial-for-ios-how-to-make-a-custom-uiview-in-ios-5-a-5-star-rating-view

本教程将帮助您创建自定义UITableView。 希望这能帮助你。

答案 2 :(得分:1)

有两种直接的方法可以做到这一点1)通知(提供的示例是用ObjC编写的)2)委托(提供的示例是用Swift编写的)

1)使用NSNotificationCenter通知UIViewController该视图属于

在你的UIView +类别中,在那里定义了手势识别处理程序,发布通知并在你的UIViewController中添加一个Observer

在UIViewController中

// Define it at the top of your view controller
#define kViewDidClick @"ViewDidClick"

 - (void)viewDidLoad {
     ...

     [[NSNotificationCenter defaultCenter]       
             addObserver: self 
                selector: @selector(presentVC:) 
                    name: kViewDidClick 
                  object: nil]; 
}

- (void)presentVC: (NSNotification *)notification {
    [self.presentViewController: vc animated: false completion: nil];
}

在您处理手势的UIView +类别中(现在我假设它被称为handleGesture)

-(void) handleGesture: (UIGestureRecognizer *)gestureRecognizer {
    [[NSNotificationCenter defaultCenter] postNotificationName: kViewDidClick object: nil];
}

2)您需要定义一个处理手势和协议的类。通过这种方式,您可以轻松处理所有手势,无需在UIView或UIViewController中定义某些方法,以便在每次处理手势时处理手势

GestureHandlerHelper.swift

import UIKit

/**
Handle gesture recognized by a UIView instance
*/

class GestureHandlerHelper {
var delegate: SelectionDelegate?

// MARK: Initializer
init(delegate: SelectionDelegate) {
    self.delegate = delegate
}

// MARK: Gesture Handler

/**
Handle gesture recognized by a UIView instance
*/
@objc func handleGesture(gestureRecongnizer: UIGestureRecognizer) {
    println(self)
    println(__FUNCTION__)
    println(gestureRecongnizer)

    if .Ended == gestureRecongnizer.state {
        if nil != delegate? {
            delegate?.didClick(gestureRecongnizer)
        }
    }
  }
}

SelectionDelegate.swift

/**
 Define a general rule for classes that handle gesture on views
 */
protocol SelectionDelegate {
    func didClick(gestureRecognizer: UIGestureRecognizer)
}

在你的UIViewController

class ViewController : UIViewController {
  ... 
  override func loadView() {
        self.view = View(frame: UIScreen.mainScreen().bounds,
          gestureHandlerHelper: GestureHandlerHelper(delegate: self))
  }
  ... 
}

extension ViewController : SelectionDelegate {

    func didClick(gestureRecognizer: UIGestureRecognizer) {
        self.presentViewController(SomeViewController(), animated: false, completion: nil)
     }
}

在你的UIView

init(frame: CGRect, gestureHandlerHelper: GestureHandlerHelper) {
      ... 
    var tapGestureRecognizer = UITapGestureRecognizer(target: gestureHandlerHelper, action: "handleGesture:")
      ...
}

答案 3 :(得分:-1)

如果你想这样,那可能会对你有帮助.. 在视图类中创建一个appdelegate对象

#import "AppDelegate.h"
AppDelegate *delegateObject = [[UIApplication sharedApplication] delegate];

然后

[delegateObject.window.rootViewController presentViewController:destinationControllerObject animated:YES completion:nil];
肮脏的方式,但会工作。