利用导航可以创建多视图应用程序,具体来说有两种导航形式,pushing/poping和presenting/dismissing。在讨论推pushing/poping view ocntrollers之前,我们需要确保理解另一个概念,UINavigationController。根据苹果公司的文档,“导航控制器(navigation controller)是一个容器视图控制器(container view controller),它管理导航界面中的一个或多个子视图控制器。在这种类型的界面中,一次只能看到一个子视图控制器”。换句话说,一个UINavigationController可以被认为是一个管理多个视图控制器的堆栈。并且,一次只有一个出现在屏幕上。
// Pushing
self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)
// Popping
self.navigationController?.popViewController(animated: Bool)
效果类似下图:
接下来讨论Presenting/Dismissing View Controllers,与pushing/poping不同,为了present/dismiss(呈现/消除)view controller,我们不需要一个UINavigationController,因此不需要堆栈。
// Presenting
self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)
// Dismissing
self.dismiss(animated: Bool, completion: (() -> Void)?)
MVC,Model、View、Controller
Delegation用于允许子对象与其父对象通信,而不必知道其父对象的确切类型。在iOS编程中,当我们希望child view controller与其parent view controller通信时,或者当我们希望tableview cell与parent tableview通信以响应某些事件时,这是非常有用的。换句话说,delegation只是一个class把任务交给另一个class的一种方式。
在swift中使用protocols实现delegation。protocol定义了适合特定任务或功能的方法、属性和其他需求的蓝图。然后,类、结构或枚举可以采用该协议来提供这些需求的实际实现。任何满足protocol要求的类型都被称为符合该protocol。换句话说,您可以认为协议类似于Java中的接口。它只是任何符合它的类需要实现的一组方法和/或属性