2010-09-22 85 views
11

希望有人可以帮我解决这个问题,因为它已经停留了好几个小时。iPhone:从子视图调用父级/超级方法

我想制作一种图画书。 我有一个视图,这是我的容器,我通过使用addsubview添加子视图。

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

我现在很迷惑什么超级观点。仅仅是用来迷惑事项,委托具有tabcontroller和家长的看法是标签按钮1

我试图

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

在委托我试过 self.tabcontroller.parentviewcontroller,selectedview,超级view.super

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

+0

什么是您的委托对象?它是'UIViewController'吗? – kubi 2010-09-22 15:41:08

+0

它是一个子类UIViewController – Burf2000 2010-09-22 16:02:49

回答

23

做这样的事情的正确方法是使用协议和委托模式。

这样定义

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

的协议,然后实现你的上海华该协议:

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

在你的子视图定义委托财产这样

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

的在你的子视图,像这样打电话给代表

[self.delegate somethingHappened :self]; 
+0

这些是viewControllers而不是视图。子视图也可以独立于超级视图。例如它所用的所有其他地方 – Burf2000 2010-09-22 15:58:31

+0

同样适用于两者。我假设你有一个viewController管理视图及其子视图。 – VdesmedT 2010-09-22 16:06:17

+0

不,每一个都有它的一个viewController。因此,每本书的页面是一个单独的类 – Burf2000 2010-09-22 16:08:09

3

这一点很难帮你没有给出任何代码,但让我们试试:

  1. 创建一个协议:但是你喜欢(我将其称之为“MyProtocol”)命名,并添加到它的定义你想在你的超级视图中调用的函数,我们称它为“respondToSwipe”
  2. 如果你的超级视图是一个UIView,你必须创建你自己的UIView的子类,并让你的超级视图成为该类的一个实例。
  3. 让你的(新)创建的上海华盈类实现的1协议)的实施“respondToSwipe”方法
  4. 创建你的子视图类型ID的实例变量,并将它命名为你喜欢的,如“myDelegate”。
  5. 传入2/3创造了上海华)为您的“myDelegate”变量
  6. 电话[myDelegate respondToSwipe]只要你喜欢
-1

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

更为标准的方式命名事件来调用方法处理程序委托而不是超级视图,使其成为一个属性,并让子视图检查是否存在的委托被设置,以及它是否可以处理该方法。

+0

我没有设置任何东西到超视图,我认为它超级,因为我添加了一个视图 – Burf2000 2010-09-22 16:02:01

+0

“超级”是不一样的superview。所以你的假设由于多种原因是不正确的(这是一个不同的问题)。 – hotpaw2 2010-09-22 16:49:16

+0

我向视图添加了一个子视图,然后我想调用父视图方法?有任何想法吗? – Burf2000 2010-09-22 16:50:55

0

对于自定义视图,你可以子类UIControl并使用控制事件:

  • 定义一些控件的事件。你可以自由地弥补谁想接收事件调用addTarget 4个控制事件(UIControlEventApplicationReserved = 0x0F000000
  • 拥有:动作:forControlEvents:
  • 有控制通话[self sendActionsForControlEvents:events]

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

或者只是使用UIGestureRecognizer(OS 3.2+)