Objective-C - 理解视图控制器

Posted

技术标签:

【中文标题】Objective-C - 理解视图控制器【英文标题】:Objective-C - Understanding view controllers 【发布时间】:2011-09-05 00:00:48 【问题描述】:

我了解视图控制器有助于控制应用程序中的多个视图,但我无法理解何时使用它们。

如果我的应用程序有一个主页、几个具有“层次结构”结构的视图,以及一个与层次结构无关的关于页面,我的应用程序应该有哪些文件? appdelegate、导航控制器和视图控制器?不止一个视图控制器?只是一个导航控制器?

另外,它们应该全部包含在一个 .xib 文件中还是多个 .xib 文件中?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

一个好习惯是为您要显示的每个页面设置一个UIViewController。如果我了解您的应用程序的结构,您应该有一个主页(其中包含许多其他 UIViews)和另一个页面(关于页面)。如果这是真的,我建议两个UIViewControllers。

UINavigationControllerUIViewController 的子类,可让您在页面之间“导航”。这不是绝对必要的,但建议使用(您也可以实现自己的自定义导航系统,但利用 Apple 为您提供的导航系统更容易)。另一个导航系统是基于UITabBarController的导航系统,如果你想看看的话。

假设我了解了您应用的结构,您应该需要两个 .xib 文件,每个页面一个。

应用代理在概念上与视图控制器不同,您只有一个应用代理,由 Xcode 自动创建(当然,您可以修改它以满足您的需要)。

【讨论】:

感谢您的回答。只是为了帮助我将其可视化,您认为 iPhone 上的联系人应用程序的项目会是什么样子?除了应用程序委托之外,它是否只是一个视图控制器类(.m 和 .h)和一个具有多个视图的 .xib 文件(即一个视图用于主列表,然后是另一个视图,其中包含所选人员的详细信息)?跨度> 显然有一个UINavigationController 和三个UIViewControllers(带有三个.xib):在主页上有联系人列表,显示在UITableView 中。触摸联系人,您将移至辅助视图,您可以在其中查看联系人信息。另一个UIViewController 是您可以添加新联系人的页面所必需的。显然它可以有不同的结构,但它肯定是一种实现方式。【参考方案2】:

每个“屏幕内容”(Apple 使用这个术语)都应该由它的 UIViewController 或更可能是它的子类来处理。视点控制器是处理视图出现或消失(进入/离开屏幕)、设备旋转、内存管理、导航到其他视图控制器等。如果您使用 IB 创建 UI,那么每个视图控制器很可能都有自己的 .xib 文件。

每个视图控制器都有一个视图(它是view 属性),它充当每个“屏幕内容”的主视图,然后您可以在其中添加子视图。

UINavigationControllerUITabBarcontroller 可以帮助您控制应用的层次结构。它们仅充当其他视图控制器的容器,并且不包含除导航栏或标签栏之外的任何 UI。使用标签栏控制器,您可以拥有多个视图控制器,它们的作用与浏览器标签完全相同。使用导航控制器,您可以拥有类似堆栈的导航,其中新的视图控制器从右向左推送,并在用户返回之前的视图控制器时从左向右弹出。您甚至可以在标签栏控制器内的导航控制器内拥有一个视图控制器。

如果您不想使用标签栏或导航控制器,您可以通过使用presentModalViewController:animated: 以模态方式呈现它们并通过dismissModalViewControllerAnimated: 关闭视图控制器来导航它们。如果您为这些方法的动画参数发送YES,您将获得由视图控制器的modalTransitionStyle 属性指定的动画被呈现或关闭。可能的动画是从底部滑入(默认)、整个屏幕的水平翻转、淡入/淡出和半页卷曲。

还有一些 Apple 提供的 UIViewController 子类可以帮助您更快地设置 UI,例如 UITableViewController,它基本上是一个视图控制器,其中包含一个表作为其主视图并符合 'UITableViewdataSourceand定义每个单元格的外观和包含的内容所需的委托协议。

在 iPad 上,有一个额外的容器控制器 UISplitViewController 和一种使用 UIPopover 呈现新视图控制器的额外方法。

【讨论】:

以上是关于Objective-C - 理解视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C:如何将信号从视图发送到视图控制器以更改视图?

(Objective-C) 打开视图控制器

无法从 Objective-C 视图控制器访问 Swift var - iOS

Objective-C 管理多个视图控制器

在视图控制器上不显示视图控制器 - Swift / Objective-C

参考从模态(objective-c)呈现视图控制器