覆盖UIView子类中的drawRect方法&将其称为另一个UIViewcontroller

时间:2013-05-21 05:52:54

标签: ios ipad core-graphics quartz-2d

我是新手ios程序员,这是我的第一个项目。我将专门为ipad开发这个项目。在这个项目中,我需要绘制几个圆圈和通过解析xml元素在它上面显示数据。我通过继承UIView类并重写drawRect方法完成了圆绘图部分。我通过loadview方法在UIViewcontroller中加载UIView子类。现在我需要做的是

  • 触摸一个圆圈并切换到另一个UIViewcontroller。

我不知道如何切换到另一个UIViewcontroller,因为所有绘图和触摸检测代码都在我的UIView子类中。

将不胜感激帮助

4 个答案:

答案 0 :(得分:1)

您需要使用委托方法告诉父视图控制器有触摸,因此它可以显示另一个视图控制器。

UIView子类标题的顶部,添加以下内容:

@protocol MyCustomViewDelegate <NSObject>

- (void)customViewCircleTapped;

@end

然后,在您的视图声明(您拥有自定义视图子类的现有声明)中:

@interface MyCustomView : UIView

...

@property (weak) id<MyCustomViewDelegate> delegate;

之后,在视图控制器中,您需要设置view.delegate = self,以便视图可以引用视图控制器。

然后,在视图控制器标题中,将声明更改为:

@interface MyViewController : UIViewController <MyCustomViewDelegate>

然后在视图控制器实现中实现customViewCircleTapped

- (void)customViewCircleTapped {
    ... // Open a view controller or something
}

完成后,在视图中的触摸检测代码中,您可以添加:

[self.delegate customViewCircleTapped];

这样做可以让您的自定义视图通过调用此方法告诉其父视图控制器发生了什么事情(如果需要传递数据,可以更改它并添加参数),然后视图控制器可以打开另一个视图控制器或基于此执行某些操作。

  

视图检测触摸→处理触摸→在视图控制器上调用customViewCircleTapped委托方法→视图控制器打开另一个视图控制器

答案 1 :(得分:0)

提供带有委托的子类视图,通知触摸视图,并在mainVC的委托调用中执行推送作业

答案 2 :(得分:0)

我喜欢这样做的方法是在响应者链上发送消息。这完全将视图与其封闭视图和视图控制器分离。因此,当您的圈子视图被点击时,它会向响应者链发出“循环视图被点击的消息” - 响应者链上的第一个响应该消息的对象(不知道/关心哪一个)将具有它被调用。它实现起来很简单。

您可以使用-tapped:作为操作将UITapGestureRecognizer附加到您的视图。

在您的视图中,您的点按操作可能如下所示。

-(IBAction)tapped:(UIGestureRecognizer*)g
{
    [ self sendAction:@selector( circleViewTapped: ) withObject:self ] ;
}

UIResponder上的-sendAction:方法是通过类别添加的,如下所示:

@implementation UIResponder (ActionSending)

-(void)sendAction:(SEL)action withObect:(id)object
{
    UIResponder * target = self ;
    while( self && ![ target respondsToSelector:action ] )
    {
        target = [ target nextResponder ] ;
    }

    [ target performSelector:action withObject:object ] ;
}

@end

您的视图控制器或响应circleViewTapped:的任何父视图或父视图控制器将在点击圆形视图时调用该方法。

关于组织观点的说明:

我会做一个圆形视图UIView子类。为要显示的每个圆实例化您的子类。每个人都附加一个UITapGestureRecognizer。手势识别器的目标是上面的-tapped:方法。

答案 3 :(得分:0)

目前的答案使解决方案过于复杂。您不需要手势识别器或委托协议。

使您的圆形绘制视图成为UIControl的子类而不是UIView。然后将视图控制器作为目标附加到UIControlEventTouchUpInside事件:

[circleView addTarget:self action:@selector(circleTapped:) forControlEvents:UIControlEventTouchUpInside];

这会在您的视图控制器上调用circleTapped:方法,并将详细视图作为发件人。