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