2011-11-09 123 views
0

我有一个超级视图,我添加一个子视图进行选择。在superview(主视图)中,我执行以下操作: [self.view addSubview:cityViewController.view];ios超级视图和子视图

在cityView中,当我完成了我需要做的事情之后,我只是做了 self.view removeFromSuperView。

问题是,从超视图内,我怎么能告诉子视图何时已经删除自己。

回答

3

有几种方法,但诚实地说,因为当前的视图控制器(我们称之为主)只是添加cityViewController的视图,保持添加/删除视图到当前视图控制器的处理,并且只需要主控制器调用[cityViewController.view removeFromSuperView]

通过这种方式,您可以在接收到此通知时执行任何您想要的代码(无论是触发方法还是UINotification)。

- 编辑样品UINotification代码 -

的main.m

... 
//Define cityViewController as an iVar and alloc/init it 
[[UINotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishView:) name:@"DidFinishView" object:nil]; 
[self.view addSubview:cityViewController.view]; 
... 

-(void) didFinishView:(NSNotification *)notification { 
    [cityViewController.view removeFromSuperView]; 
} 

CityViewController.m

-(IBAction) doneButtonClick:(id) sender { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DidFinishView" object:nil]; 
} 
+0

但我该如何处理由cityview发生的事件导致的父视图上的事件 – Jesse

+0

再次,有几种方法可以做到这一点。其中最简单的就是使用UINotification。我会将代码添加到我的答案中来演示。 – Geekswordsman

0

简单的回答是你的观点不应该自行消除。视图通过对象间通信机制将用户交互传达给相关控制器是更好的做法。最常见的方法是直接消息传递,协议和通知。 iOS框架使用所有这些,并且有很好的文档解释它们。这里有一个小结:

  • 直接消息。当一个对象需要与一个已知类型的特定对象进行通信时使用它。例如,如果MyView始终包含在MyViewController中,并且需要向其发送消息,则可以将属性添加到MyView类中,该类保留指向特定MyViewController对象的指针。然后,您可以通过[myView.myViewController userDidTapSaveButton]或其他任何方式将消息从myView发送到myViewController

  • 协议。一个协议定义了一个对象之间的契约,除了他们遵守契约之外,他们对彼此都不了解。例如,UITableView知道它的委托符合UITableViewDelegate协议,它可以将所需的协议消息发送给它的委托。任何对象都可以符合UITableViewDelegate协议。

  • 通知。通知允许对象通过其他对象可以观察和响应的中央机制(NSNotificationCenter)发布通知。当发布通知的对象不知道或关心哪些对象正在观察它的通知时,通知很有用。

我会阅读相关文档和其他关于这些方法的SO &。我还会研究一下MVC(模型/视图/控制器)设计模式,以便您更加清楚知道应用逻辑的位置。一般来说,视图只应负责显示(根据控制器设置的属性),观察/响应用户操作,并通知其控制器执行相关操作。

相关问题