我有一个superview,我添加了一个子视图来进行选择。在superview(主视图)中,我执行以下操作: [self.view addSubview:cityViewController.view];
在cityView中,当我完成了我需要做的事情时,我就是这样做的 self.view removeFromSuperView。
问题是,在超级视图中,如何判断子视图何时自行删除。
答案 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(模型/视图/控制器)设计模式,以便您更清楚地了解应用逻辑的位置。通常,视图应仅负责显示(基于其控制器设置的属性),观察/响应用户操作,并通知其控制器进行相关操作。