11

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

我正在尝试制作一种图画书。我有一个视图,它是我的容器,我使用 addsubview 向其中添加子视图。

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

我现在对超级视图是什么感到非常困惑。只是为了混淆问题,委托有一个选项卡控制器,父视图是选项卡按钮 1

我试过了

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

在委托上,我尝试了 self.tabcontroller.parentviewcontroller、selectedview、super view.super

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

4

5 回答 5

23

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

定义一个协议,如

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

然后在您的超级视图中实现该协议:

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

像这样在您的 SubView 中定义一个委托属性

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

在您的子视图中,像这样调用委托

[self.delegate somethingHappened :self];
于 2010-09-22T15:24:25.517 回答
3

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

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

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

  • 定义一些控制事件。您可以随意编造 4 个控制事件 ( UIControlEventApplicationReserved = 0x0F000000)
  • 让想要接收事件的人调用 addTarget:action:forControlEvents:
  • 进行控制调用[self sendActionsForControlEvents:events]

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

或者只使用 UIGestureRecognizer (OS 3.2+)

于 2010-09-23T00:41:04.727 回答
-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

于 2010-11-26T13:51:49.930 回答
-1

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

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

于 2010-09-22T15:34:42.837 回答