【问题标题】:Overriding drawRect method in a UIView subclass & call it into another UIViewcontroller在 UIView 子类中覆盖 drawRect 方法并将其调用到另一个 UIViewcontroller
【发布时间】:2013-05-21 05:52:54
【问题描述】:

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

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

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

我们将不胜感激

【问题讨论】:

  • 直到这里看起来不错。您需要从绘制圆圈的子类中加载 UIVC。
  • 能否详细说明您的答案。我的意思是我已经在 UIViewcontroller 中加载了 UIView 子类。现在我需要在我的 UIView 子类中触摸一个圆圈后切换到另一个 UIViewcintroller。谢谢

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


【解决方案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委托方法→视图控制器打开另一个视图控制器

【讨论】:

  • 感谢您的回复。我已经在视图控制器的 viewDidLoad 方法中完成了对视图控制器部分的视图引用,如下所示... iOSCircleView *viewDelegate =[[iOSCircleView alloc]init]; viewDelegate.delegate = self;可以吗?....其余的事情都按照您的指示完成了。仍然无法正常工作
  • 在您的视图中的触摸处理代码中设置断点,以确保正在调用[self.delegate customViewCircleTapped]。您需要从触摸处理代码中调用此方法,然后在视图控制器的实现中添加代码以打开另一个视图控制器或其他操作。
  • 最后我让它可以工作了。只需在视图控制器的 loadView 方法中将委托作为参数传递。无论如何,我会将您的答案视为已接受的答案。非常感谢.....
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    您将 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: 方法。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多