【问题标题】:How can I get the ViewController instance starting from subView如何从 subView 获取 ViewController 实例
【发布时间】:2013-12-02 18:19:26
【问题描述】:

我有一个扩展 UIImageView 的 UIImageCustom 对象,并且在一个方法中,我想在这个类中获取 ViewController 实例,我的对象 UICustom 在其中添加。

在我的 UIImageCustom 类的 touchesBegan 方法中,当我触摸 UIImage 时,我想在我的 ViewController 中添加其他 UIImage:

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    {
        UIImageView* newImageView=[[UIImageView alloc] initWithFrame:CGRectMake(60, 200, 200, 200)];

        //Here I need add newImageView in my ViewController
        [??? addSubview:newImageView];
    }

有人可以帮助我吗?

【问题讨论】:

  • 为什么不在 ViewController 本身中实现 ​​touchesBegan ?
  • 嗨@Bhumeshwerkatre!我已经实现了,但现在我想在其他 ViewControllers 中使用我的 UIImageCustom !!

标签: ios objective-c uiviewcontroller uiimageview


【解决方案1】:

如果你想做你说你想做的事,你必须向你的 UIImageCustom 类添加一个自定义属性,其中包含对所有者视图控制器的引用。但是有更好的方法。

我建议你应该做的是在拥有视图的视图控制器中实现 touchesBegan,并在那里执行任何自定义逻辑。

【讨论】:

  • 嗨@Travis,我已经实现了,但现在我想在其他 ViewControllers 中使用我的 UIImageCustom,我认为这可能会在 UIImageCustom 中生成不重复的代码。
  • 在这种情况下,您是否考虑过实现委托模式?您的自定义视图可以声明一个协议并拥有一个委托属性,您可以回调视图控制器并告诉他们该做什么?
【解决方案2】:

有很多方法可以做到这一点(在UIImageCustom 类中设置自定义属性,只需让UIImageCustom 将此新图像视图添加到它自己的superview(例如[self.superview addSubview:newImageView])。但是这些方法似乎在概念上存在缺陷。视图不应该添加任何其他内容(如果您关闭剪辑,则将此新图像视图添加为UIImageCustom 的子视图本身,可能是另一种方法,当然不如我提到的前两个)。

但我可能会建议其他几种方法:

  1. 如果您的目标只是避免重复触摸代码,我可能会将其放在手势识别器子类中,而不是将其附加到某个随机的 UIImageView 子类中。手势识别器是放置这种与触摸相关的代码的正确位置。请参阅iOS 事件处理指南的Gesture Recognizers 部分。

  2. 或者,如果您确实需要将此手势与一堆图像视图结合起来,我可能会使用自定义容器视图控制器来调解手势和图像视图之间的这种交互。更多信息请参阅View Controller Programming Guide中的Creating Custom Container View Controllers

    但是您可以将触摸代码和这两个图像视图的处理都封装在一个视图控制器中,然后使用视图控制器包含将其添加到现有的视图控制器中。

我们对特定设计知之甚少,无法相互推荐,但这是一些值得追求的想法。最有可能的是,自定义手势识别器方法应该绰绰有余。

【讨论】:

    【解决方案3】:

    创建一个这样的类别

    @interface UIViewController (TOP_MODAL)
    -(UIViewController*) topModalController;
    @end
    
    @implementation UIViewController (TOP_MODAL)
    -(UIViewController*) topModalController{
        if (self.presentedViewController == nil){
            return self;
        }
        return self.presentedViewController.topModalController;
    }
    
    @end
    

    然后

    AppDelegate* delegate =  (AppDelegate*)[[UIApplication sharedApplication] delegate];
    UIViewController* viewController = [delegate.window.rootViewController topModalController];
    ...
    [viewController.view addSubview:newImageView];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多