我有一个超级视图,我添加了一个子视图来进行选择。在超级视图(主视图)中,我执行以下操作: [self.view addSubview:cityViewController.view];
在cityView中,当我完成我需要做的事情后,我只需执行self.view removeFromSuperView。
问题是,从超级视图中,我如何判断子视图何时自行删除。
有几种方法,但老实说,由于当前视图控制器(我们称其为 main)只是添加cityViewController
的视图,继续处理向当前视图控制器添加/删除视图,并且只调用主控制器[cityViewController.view removeFromSuperView]
这样,您可以在收到此通知时执行您想要的任何代码(无论是触发的方法还是UINotification
)。
-- 编辑示例 UINotification 代码 --
主文件
...
//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];
}
快速的答案是您的视图不应该自行删除。视图通过对象间通信机制将用户交互传达给相关控制器是更好的做法。最常见的方法是直接消息传递、协议和通知。iOS 框架使用了所有这些,并且有很好的文档解释它们。这是一个简短的摘要:
直接消息。当对象需要与已知类型的特定对象通信时使用此选项。例如,如果MyView
始终包含在MyViewController
其中并需要向其发送消息,您可以向MyView
该类添加一个属性,该属性保留指向特定MyViewController
对象的指针。然后,您可以通过或其他myView
方式向其发送消息。myViewController
[myView.myViewController userDidTapSaveButton]
协议。协议定义了对象之间的契约,这些对象除了遵守契约外,彼此一无所知。例如,UITableView
知道它的委托符合UITableViewDelegate
协议,它可以向它的委托发送所需的协议消息。任何对象都可以符合UITableViewDelegate
协议。
通知。通知允许对象通过NSNotificationCenter
其他对象可以观察和响应的中央机制 ( ) 发布通知。当发布通知的对象不知道或不关心哪些对象正在观察它的通知时,通知很有用。
我会阅读有关这些方法的相关文档和其他关于 SO 的问答。我还会对 MVC(模型/视图/控制器)设计模式进行一些研究,以便您更轻松地知道将应用程序逻辑放在哪里。一般来说,一个视图应该只负责它的显示(基于它的控制器设置的属性),观察/响应用户操作,并通知它的控制器相关的操作。