0

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

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

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

帮助将不胜感激

4

4 回答 4

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在视图控制器上调用委托方法→视图控制器打开另一个视图控制器

于 2013-05-21T06:05:46.607 回答
0

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

于 2013-05-21T06:06:34.873 回答
0

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

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

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

-(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:上面的方法。

于 2013-05-21T06:28:07.080 回答
0

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

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

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

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

于 2013-05-21T06:54:41.687 回答