Ios 重写UIView子类中的drawRect方法&;将其调用到另一个UIViewcontroller中

Ios 重写UIView子类中的drawRect方法&;将其调用到另一个UIViewcontroller中,ios,ipad,core-graphics,quartz-2d,Ios,Ipad,Core Graphics,Quartz 2d,我是一个ios程序员新手,这是我的第一个项目。我将专门为ipad开发这个项目。在这个项目中,我需要画几个圆圈,并通过解析xml元素来显示圆圈上的数据。我通过loadview方法在UIViewcontroller中加载UIView子类 触摸圆圈并切换到另一个UIViewcontroller 我不知道如何切换到另一个UIViewcontroller,因为所有的绘图和触摸检测代码都在我的UIView子类中 如果您需要帮助,我们将不胜感激。您需要使用委托方法告知父视图控制器有触摸,以便它可以显示另一

我是一个ios程序员新手,这是我的第一个项目。我将专门为ipad开发这个项目。在这个项目中,我需要画几个圆圈,并通过解析xml元素来显示圆圈上的数据。我通过loadview方法在UIViewcontroller中加载UIView子类

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


如果您需要帮助,我们将不胜感激。

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

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

@protocol MyCustomViewDelegate <NSObject>

- (void)customViewCircleTapped;

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

- (void)customViewCircleTapped {
    ... // Open a view controller or something
}
完成此操作后,您可以在视图中的触摸检测代码中添加:

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

视图检测触摸→ 过程接触→ 调用视图控制器上的委托方法→ 视图控制器打开另一个视图控制器


为子类视图提供一个委托,通知该视图已被触动,并在mainVC中的委托调用中执行推送作业,我喜欢这样做的方式是向响应者链发送消息。这将使视图与其封闭视图和视图控制器完全解耦。因此,当点击circle视图时,它会向响应者链发出“circle view was tapped message”(圆圈视图已点击消息)——响应者链上响应该消息的第一个对象(不知道/关心哪个对象)将被调用。它很容易实现

将UITapGestureRecognitor附加到视图,并将
-点击:
作为操作

在您看来,您的点击操作可能如下所示

-(IBAction)tapped:(UIGestureRecognizer*)g
{
    [ self sendAction:@selector( circleViewTapped: ) withObject:self ] ;
}
UIResponder上的
-sendAction:
方法是通过一个类别添加的,如下所示:

@interface MyViewController : UIViewController <MyCustomViewDelegate>
@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:
方法。

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

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

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

这将调用视图控制器上的
circleTapped:
方法,点击视图作为发送方

直到这里看起来不错。你需要从画圆圈的子类加载UIVC。请详细说明你的答案。我的意思是我已经在UIViewcontroller中加载了UIView子类。现在,在我的UIView子类中点击一个圆圈后,我需要切换到另一个UIViewcintroller。感谢您的回复。我在视图控制器的viewDidLoad方法中完成了视图引用到视图控制器部分,如下所示。。。iOSCircleView*viewDelegate=[[iOSCircleView alloc]init];viewDelegate.delegate=self;是否正常?…其余部分已按照您的说明完成。仍然不起作用在视图中的触摸处理代码中设置断点,以确保调用
[self.delegate customViewCircleTapped]
。您需要从触摸处理代码调用此方法,然后在视图控制器的实现中添加代码以打开另一个视图控制器或其他操作。最后,我已使其可行。只是在视图控制器的loadView方法中将委托作为参数传递。不管怎样,我认为你的回答是可以接受的。非常感谢。。。。。
[circleView addTarget:self action:@selector(circleTapped:) forControlEvents:UIControlEventTouchUpInside];