繁体   English   中英

ios超级视图和子视图

[英]ios superview and subview

我有一个超级视图,并添加了一个子视图进行选择。 在超级视图(主视图)中,我执行以下操作:[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 userDidTapSaveButton]或其他方式将消息从myView发送到myViewController

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

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

我已经阅读了有关这些方法的相关文档以及关于SO的其他问答。 我还将对MVC(模型/视图/控制器)设计模式进行一些研究,以使您更轻松地知道将应用程序逻辑放在哪里。 通常,视图仅应负责显示(基于其控制器设置的属性),观察/响应用户操作并通知其控制器进行相关操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM