3

我是Objective-C的初学者。如果我的问题很愚蠢,请原谅。

在 myroot view controller A中,我添加了一个subviewB。在 b 中还会有另一个subview C. C 包含另一个subview D. 如何在A from D. 我知道我们可以使用委托将数据传递给parent controller. 但我的问题是,我是否需要创建代表哪些调用C from D和另一个调用B from C等等?或者有没有直接调用方法的方法A from D

4

5 回答 5

3

但我的问题是,我是否需要创建一个从 D 调用 C 的委托和另一个从 C 调用 B 的委托,依此类推?

视图控制器的工作是管理它的视图和该视图的所有子视图。如果您有一个需要向视图控制器发送消息的视图,例如当用户更改其值时需要在某处发送消息的控件,那么视图控制器应该知道它就在那里。在这种情况下,视图控制器可以在加载视图层次结构时将自己(或其他适当的对象)设置为所述子视图的委托或目标,如下所示:

- (void)viewDidLoad
{
    self.needControl.delegate = self;
}

这样,有需要的控件就不需要知道作为其委托的对象的任何信息。它没有假设对象是视图控制器,或者它的父视图,或者其他任何东西。它所关心的只是它有一个委托,并且它的委托实现了必要的方法。反过来,这可以帮助您保持代码更加灵活和可维护,甚至可以重用。

于 2013-04-18T04:59:36.540 回答
2

我是否需要创建一个从 D 调用 C 的委托和另一个从 C 调用 B 的委托,依此类推?

您可以使用单个委托从 D 调用 A 中的方法。根据您的评论,我了解到 B、C、D 是 UIView 控制的根视图控制器。所以这项工作很简单,您需要在创建每个子视图时将委托设置为其根视图控制器。
1. 视图 B 是从根视图控制器本身创建的,所以viewB.delegate = self
2. 视图 C 是从视图 B 创建的,所以viewC.delegate = self.delegate
3. 对视图 D 也重复同样的操作

现在您的所有视图都由您的委托 rootViewController 控制。
最后这个答案将帮助您完成任务

于 2013-04-18T04:52:56.877 回答
1

您应该构建您的代码,以便 D 类根本不知道 A 类存在。

在 iOS/Mac 编程中有一些常见的特定技术:

  • D 类有一个委托属性,并在其上调用方法。当只有一个对象可以接收委托方法时使用它,这对于询问是否应该立即启用或禁用它的按钮特别有用。使用界面生成器将视图的委托设置为您的 A 类实例。
  • 类 D 应该有一个“目标”属性(类型id)和一个“动作”属性(类型SEL),并将动作消息/选择器发送到目标对象。当视图具有触发的特定单个操作时很有用,例如按下按钮时,或者用户在文本字段中按下 Enter 键。使用界面生成器将视图的目标和操作设置为您的 A 类实例。
  • D 类将消息和元数据发送到 [NSNotificationCenter defaultCenter],A 类告诉通知中心它想要观察这些通知。当发生某些事情时可能需要通知许多对象时很有用,例如当文本字段接收或失去键盘焦点时。
  • 类 D 具有一个或多个属性,只要该属性的值发生更改,就会发送 Key Value Observing 通知。A 类会告诉 Key Value Observing 系统,它想知道 D 类的特定属性何时发生变化。当您特别关心某些数据时,这很有用,例如当文本字段的值发生变化时。

所有这些技术在堆栈溢出或 Apple 官方文档中都有更详细的描述。

B 类和 C 类也不应该知道 A 类存在。A 类应该知道如何找到其他对象,除非您可以使用界面生成器(前两个选项允许这样做)。

于 2013-04-18T04:55:56.433 回答
0

将您的A_viewCon.h文件添加到您的D_viewCon.h文件中

创建对象A_viewCon并正确设置@property@synthesize

调用A_viewConinD_viewCon编写以下代码的方法。

[self.objectOFA_viewCon performSelector:@selector(MethodNameOFA_viewCon) withObject:nil afterDelay:0];
于 2013-04-18T04:50:50.933 回答
0

你可以注册A类来观察一个NSNotificationlike ->

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

NSNotifications从 D 类的对象发布,例如 ->

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

这样您就不需要保留引用/委托,并且您仍然可以在活动对象之间进行通信。

于 2013-04-18T04:54:02.460 回答