ios superview和subview

时间:2011-11-09 20:21:11

标签: ios subview superview

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

在cityView中,当我完成了我需要做的事情时,我就是这样做的     self.view removeFromSuperView。

问题是,在超级视图中,如何判断子视图何时自行删除。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

  • 直接消息传递。当对象需要与已知类型的特定对象通信时,请使用此选项。例如,如果MyView中始终包含MyViewController并且需要向其发送消息,则可以向MyView类添加一个属性,该类保留指向特定MyViewController的指针宾语。然后,您可以通过myView或其他任何内容从myViewController[myView.myViewController userDidTapSaveButton]发送消息。

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

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

我在SO上阅读了有关这些方法的相关文档和其他Q&amp; A.我还将研究一下MVC(模型/视图/控制器)设计模式,以便您更清楚地了解应用逻辑的位置。通常,视图应仅负责显示(基于其控制器设置的属性),观察/响应用户操作,并通知其控制器进行相关操作。