Objective-C - 理解视图控制器
Posted
技术标签:
【中文标题】Objective-C - 理解视图控制器【英文标题】:Objective-C - Understanding view controllers 【发布时间】:2011-09-05 00:00:48 【问题描述】:我了解视图控制器有助于控制应用程序中的多个视图,但我无法理解何时使用它们。
如果我的应用程序有一个主页、几个具有“层次结构”结构的视图,以及一个与层次结构无关的关于页面,我的应用程序应该有哪些文件? appdelegate、导航控制器和视图控制器?不止一个视图控制器?只是一个导航控制器?
另外,它们应该全部包含在一个 .xib 文件中还是多个 .xib 文件中?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
【参考方案1】:一个好习惯是为您要显示的每个页面设置一个UIViewController
。如果我了解您的应用程序的结构,您应该有一个主页(其中包含许多其他 UIView
s)和另一个页面(关于页面)。如果这是真的,我建议两个UIViewController
s。
UINavigationController
是 UIViewController
的子类,可让您在页面之间“导航”。这不是绝对必要的,但建议使用(您也可以实现自己的自定义导航系统,但利用 Apple 为您提供的导航系统更容易)。另一个导航系统是基于UITabBarController的导航系统,如果你想看看的话。
假设我了解了您应用的结构,您应该需要两个 .xib 文件,每个页面一个。
应用代理在概念上与视图控制器不同,您只有一个应用代理,由 Xcode 自动创建(当然,您可以修改它以满足您的需要)。
【讨论】:
感谢您的回答。只是为了帮助我将其可视化,您认为 iPhone 上的联系人应用程序的项目会是什么样子?除了应用程序委托之外,它是否只是一个视图控制器类(.m 和 .h)和一个具有多个视图的 .xib 文件(即一个视图用于主列表,然后是另一个视图,其中包含所选人员的详细信息)?跨度> 显然有一个UINavigationController
和三个UIViewController
s(带有三个.xib):在主页上有联系人列表,显示在UITableView
中。触摸联系人,您将移至辅助视图,您可以在其中查看联系人信息。另一个UIViewController
是您可以添加新联系人的页面所必需的。显然它可以有不同的结构,但它肯定是一种实现方式。【参考方案2】:
每个“屏幕内容”(Apple 使用这个术语)都应该由它的 UIViewController
或更可能是它的子类来处理。视点控制器是处理视图出现或消失(进入/离开屏幕)、设备旋转、内存管理、导航到其他视图控制器等。如果您使用 IB 创建 UI,那么每个视图控制器很可能都有自己的 .xib 文件。
每个视图控制器都有一个视图(它是view
属性),它充当每个“屏幕内容”的主视图,然后您可以在其中添加子视图。
UINavigationController
和 UITabBarcontroller
可以帮助您控制应用的层次结构。它们仅充当其他视图控制器的容器,并且不包含除导航栏或标签栏之外的任何 UI。使用标签栏控制器,您可以拥有多个视图控制器,它们的作用与浏览器标签完全相同。使用导航控制器,您可以拥有类似堆栈的导航,其中新的视图控制器从右向左推送,并在用户返回之前的视图控制器时从左向右弹出。您甚至可以在标签栏控制器内的导航控制器内拥有一个视图控制器。
如果您不想使用标签栏或导航控制器,您可以通过使用presentModalViewController:animated:
以模态方式呈现它们并通过dismissModalViewControllerAnimated:
关闭视图控制器来导航它们。如果您为这些方法的动画参数发送YES
,您将获得由视图控制器的modalTransitionStyle
属性指定的动画被呈现或关闭。可能的动画是从底部滑入(默认)、整个屏幕的水平翻转、淡入/淡出和半页卷曲。
还有一些 Apple 提供的 UIViewController 子类可以帮助您更快地设置 UI,例如 UITableViewController
,它基本上是一个视图控制器,其中包含一个表作为其主视图并符合 'UITableViewdataSource
and
定义每个单元格的外观和包含的内容所需的委托协议。
在 iPad 上,有一个额外的容器控制器 UISplitViewController
和一种使用 UIPopover
呈现新视图控制器的额外方法。
【讨论】:
以上是关于Objective-C - 理解视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C:如何将信号从视图发送到视图控制器以更改视图?
无法从 Objective-C 视图控制器访问 Swift var - iOS