2013-04-18 63 views
3

我是初学者objective-C。所以请原谅,如果我的问题是愚蠢的。如何将数据传递给ios中的父类?

在我root view controller A,我添加了一个subview B. B中就会有另一个subview C。 C包含另一个subview D。 如何在A from D中调用方法。 我知道我们可以使用代表将数据传递给parent controller。 但我的问题是,我是否需要创建代表调用C from D和另一个呼吁B from C等? 或者有什么方法可以直接调用A from D中的方法吗?

+2

更多关于你想要做什么的背景会有所帮助。视图实际上不应该以任何方式在视图控制器中调用方法。 – rdelmar 2013-04-18 04:51:42

+0

当我从'D'初始化'A'时,所有的属性都会初始化。所以我失去了价值。这是我的问题 – manujmv 2013-04-18 05:10:04

+2

B,C,D'UIView'或'UIViewControllers'? – viral 2013-04-18 05:15:48

回答

0

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

创建对象的A_viewCon,并设置@property@synthesize为正常。

调用A_viewCon的方法D_viewCon写下面的代码。

[self.objectOFA_viewCon performSelector:@selector(MethodNameOFA_viewCon) withObject:nil afterDelay:0]; 
+0

的问题是,当我们从D初始化一个A时,A的所有属性也将初始化 – manujmv 2013-04-18 04:53:59

+0

@manujmv-那么什么?如果OP想把功能作为他/她需要的话,那么这不是一个坏主意.. :) – 2013-04-18 04:58:48

+0

@TheKing他是OP – viral 2013-04-18 05:14:32

2

我是否需要创建委托,从d,另一个用于呼叫B,从C等调用C? 没有

您可以使用一个单一的委托,从D.调用一个方法从你的意见,我认识了B,C,d是的UIView的控制,你的根视图控制器。所以这项工作很简单,您需要在创建每个子视图时将委托设置为其根视图控制器。
1.查看B从根视图控制器本身,以便viewB.delegate =自创建
2.查看C从视图乙所以viewC.delegate = self.delegate
3.重复相同创建查看D也

现在所有的意见都是由您的委托rootViewController控制。
最后This answer将帮助你完成你的任务

0

U可以注册一个类来观察NSNotification像 - >

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

,并从像d类的对象后NSNotifications - >

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

这样,你不需要保留一个参考/代表,仍然可以沟通活着的对象之间。

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应该是知道如何查找其他对象的类,除非您可以使用界面构建器(前两个选项允许)。

3

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

视图控制器的工作是管理它的视图和所有视图的子视图。如果你有一个需要向视图控制器发送消息的视图,比如当用户改变它的值时需要发送消息的控件,那么视图控制器应该知道它在那里。

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

通过这种方式,有需要的控制:在这种情况下,作为所述子视图的委托或目标时视图层次结构被加载,这样视图控制器可以采取设置本身(或一些其它适当的对象)的护理不需要知道任何有关它的代表的对象。它并不假定对象是视图控制器,它的父视图或其他任何东西。所有它关心的是它有一个委托,并且它的委托实现了必要的方法。反过来,这又可以帮助您保持代码更加灵活和可维护,甚至可以重用。

相关问题