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

11

希望有人能够帮助我,因为我已经卡了几个小时了。

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

在子视图上,我有划动手势等,我想要触发父视图中的方法。 我弄清楚如何触发委托,但我无法让委托触发父视图。 我已经阅读了10种不同方法,但没有一种方法可行。

我现在非常困惑超级视图的作用是什么。 更令人困惑的是,委托具有tabcontroller,而父视图是选项卡按钮1

我尝试过:

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

我尝试在委托中使用了self.tabcontroller.parentviewcontroller,selectedview和superview.super。

更新: 由于它是一个可重复使用的视图,子视图需要独立于父视图。 此外,我没有将parentview设置为superview,因为我认为superview只是一个包含子视图的视图(请不要杀我)。 所以也许我只需要将parentview设置为superview?


你的委托对象是什么?它是一个 UIViewController 吗? - kubi
这是一个子类化的UIViewController。 - Burf2000
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];

这些是视图控制器而不是视图。此外,子视图可以独立于父视图。例如,它在其他地方都可以使用。 - Burf2000
同样的原则适用于两者。我假设您有一个视图控制器来管理一个视图及其子视图。 - VdesmedT
不是的,每个页面都有自己的视图控制器。因此,书中的每一页都将是一个单独的类。 - Burf2000
我不得不将协议放入AppDelegate中,然后我得到了以下错误信息: 2010-09-22 17:13:12.805 UniversalApp[27372:207] -[CustomViewController delegate]: unrecognized selector sent to instance 0x7b36bd0 2010-09-22 17:13:12.808 UniversalApp[27372:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CustomViewController delegate]: unrecognized selector sent to instance 0x7b36bd0' - Burf2000
我知道这个问题有点老了,但我想补充一下,在您的superView实现中,创建子视图后,您需要像这样设置其代理:subView.delegate = self; - tptcat

3

没有给出任何代码,帮助你有些困难,但我们试一试:

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

0

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

  • 定义一些控件事件。 您可以自由地编写4个控件事件(UIControlEventApplicationReserved = 0x0F000000
  • 让想要接收事件的人调用addTarget:action:forControlEvents:
  • 让控件调用[self sendActionsForControlEvents:events]

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

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


-1

2
链接已经无法访问。 - NightFury

-1

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

更标准的命名方式是将方法处理程序称为委托而不是超级视图,将其作为属性,并使子视图检查委托是否已设置以及它是否可以处理该方法。


我没有将任何东西设置为superview,因为我假设它是super,因为我向其中添加了一个视图。 - Burf2000
"super" 不等同于 superview。因此,您的假设有多个错误(这是另一个问题)。 - hotpaw2
我向一个视图添加了一个子视图,然后想调用父视图的方法?有什么想法吗? - Burf2000
在您的子视图中添加一个委托,并从父视图中设置它。该委托将是您想要调用的“超级视图”。这并不是自动的(也不简单),您必须手动和明确地执行它。 - hotpaw2
UIView 会自动为你处理 superview 指针。 - tc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接