【问题标题】:iPhone: calling a parent/super method from a subviewiPhone:从子视图调用父/超级方法
【发布时间】:2010-09-22 15:13:46
【问题描述】:

希望有人可以帮助我解决这个问题。

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

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

我现在对超级视图是什么感到非常困惑。只是为了混淆问题,delegate 有一个 tabcontroller,父视图是 tab button 1

我试过了

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

在我尝试过的委托上 self.tabcontroller.parentviewcontroller, selectedview, super view.super

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

【问题讨论】:

  • 你的委托对象是什么?是UIViewController吗?
  • 它是 UIViewController 的子类

标签: iphone cocoa-touch superview


【解决方案1】:

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

定义一个类似的协议

@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];

【讨论】:

  • 这些是视图控制器而不是视图。子视图也可以独立于超级视图。例如,它在所有其他地方都使用过
  • 同样的原则适用于两者。我假设你有一个 viewController 管理一个视图及其子视图。
  • 不,每个都有它的一个viewController。所以一本书的每一页都是一个单独的类
  • 我必须将协议放入 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] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[CustomViewController 委托]:无法识别的选择器发送到实例 0x7b36bd0”
  • 我知道这是旧的,但我想在创建子视图后在你的 superView 实现中添加它,你需要像这样设置它的委托:subView.delegate = self;
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    或者只使用 UIGestureRecognizer (OS 3.2+)

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我没有为 superview 设置任何东西,我认为它是超级的,因为我添加了一个视图
      • "super" 与 superview 不同。因此,由于多种原因,您的假设是不正确的(这是一个不同的问题)。
      • 我给一个视图添加了一个子视图,然后我想调用父视图的方法?有什么想法吗?
      • 将代理添加到您的子视图,并从您的父视图设置它。代表将是您想要称之为“超级视图”的东西。没有什么是自动的(简单的),你必须手动明确地完成。
      • UIView 会自动为您处理超级视图指针。
      【解决方案5】:

      这是一个很好的例子,说明了如何在 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

      【讨论】:

      • 链接无法访问。
      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多