iPhone:从子视图调用父/超级方法

时间:2010-09-22 15:13:47

标签: iphone cocoa-touch superview

希望有人可以帮我解决这个问题,因为他们被困了好几个小时。

我正在尝试制作一本图画书。 我有一个视图是我的容器,我通过使用addsubview添加子视图。

在子视图中,我有滑动手势等,我想在父视图中触发关闭方法。我找出了如何触发委托,但我不能让委托触发父视图。我已经阅读了10种不同的方法,但没有工作。

我现在对超级视图的含义感到非常困惑。只是为了混淆问题,委托有一个tabcontroller,父视图是tab按钮1

我试过

[self.view.superview method]
[self.superview method]

在代表上我试过了 self.tabcontroller.parentviewcontroller,selectedview,super view.super

更新: 子视图需要独立于父视图作为其可重用视图。 另外我没有将父视图设置为superview,因为我只是认为superview是一个带子视图的视图(请不要杀了我)。那么也许我只需要将父视图设置为superview?

5 个答案:

答案 0 :(得分:23)

执行此类操作的正确方法是使用协议和委托模式。

定义类似

的协议
@protocol subViewDelegate
   -(void)somethingHappened:(id)sender;
@end

然后在你的superview中实现该协议:

@interface superView:UIViewController<subViewDelegate> {
...
}
...
@end

在SubView中定义一个委托属性,如此

@interface subView : UIView {
   id<subViewDelegate> delegate;
   ...
}
@propery (nonatomic, assign) id<subViewDelegate> delegate;
...
@end

在子视图中,像这样调用代理

[self.delegate somethingHappened :self];

答案 1 :(得分:3)

在没有给出任何代码的情况下帮助你有点困难,但让我们试试:

  1. 创建一个协议:根据你的喜好命名(我将其命名为“MyProtocol”)并在其中添加要在superview中调用的函数的定义,让我们称之为“respondToSwipe”
  2. 如果你的superview是一个UIView,你必须创建自己的UIView子类,并使你的superview成为该类的一个实例。
  3. 让你的(新)创建的superview类实现1的协议。)实现“respondToSwipe”方法
  4. 在子视图中创建类型为id的实例变量,并根据需要为其命名,例如: “myDelegate”。
  5. 将2/3中创建的超级视图传递给您的“myDelegate”变量
  6. 随时调用[myDelegate respondToSwipe]

答案 2 :(得分:0)

对于自定义视图,您可以继承UIControl并使用控制事件:

  • 定义一些控制事件。您可以自由组成4个控制事件(UIControlEventApplicationReserved = 0x0F000000
  • 想要接收事件的人请调用addTarget:action:forControlEvents:
  • 拥有控制权电话[self sendActionsForControlEvents:events]

或者,您可以使用UIGestureRecognizer样式的界面(addTarget:action :)。

或者只使用UIGestureRecognizer(OS 3.2 +)

答案 3 :(得分:-1)

在添加子视图时,您的父视图是否将自己设置为子视图的超级视图?否则,子视图不知道其超级视图是谁。

命名事物的更标准方法是调用方法处理程序代理而不是superview,使其成为属性,并使子视图检查是否存在要设置的委托以及是否可以处理该方法。 / p>

答案 4 :(得分:-1)

这是一个如何在iPhone上应用委托模式的一个很好的例子。我下载了代码,它运行得很好。

http://www.hivestudio.cat/index.php?option=com_content&view=article&id=57:technical-note-the-delegation-pattern-on-the-iphone&catid=35:technical-note-category&Itemid=76