重用UIViewController用于模态和非模态情况

Sam*_*Sam 5 iphone cocoa-touch uiviewcontroller uinavigationcontroller ios

我有一个UIViewController - 我们称之为"FormController" - 它只是一个编辑对象的表单.我想在两种不同的情况下使用它:

  1. 创建一个新对象 - 使用UINavigationController的presentModalViewController:方法.

  2. 编辑现有对象 - 将视图控制器推送到UINavigationController堆栈,而不是使用对话框方法.

在模态情况下,我希望有一个带有"取消"和"完成"按钮的工具栏,但在堆栈情况下,我想要只有UINavigationController提供的导航栏.

这类似于Contacts应用程序,其中"New Contact"和"Edit Contact"屏幕似乎使用相同的视图控制器,但New Contact表单以模态方式呈现,而Edit屏幕被推送到导航堆栈.

我的问题是:在不必编写2个独立但大部分相同的视图控制器的情况下,处理这两种情况的最佳方法是什么?

我想创建一个"ModalFormController",通过组合封装裸"FormController"并添加一个工具栏,但我在文档中的某处读到Apple不建议嵌套视图控制器.

Ale*_*lds 2

我所做的(有时)是设置一个enum指定视图控制器的类型。

例如,您可能有两种类型:一个Edit类型和一个Add(“新”)类型。

Add类型是通过模态视图控制器实现的,同时该Edit类型被推送到现有的导航堆栈上。

在视图控制器的-viewDidLoad:方法中,我只是创建一个switch/case树,根据上面指定的类型枚举来设置标题和其他外观特征。

这样做的好处是很容易添加新类型。缺点是处理此枚举的条件树可能会很快变得复杂,具体取决于类型的不同程度。

switch/case树使它更容易管理。

因此,这取决于您想要对这两种类型做什么。但这绝对是可行的。

  • 谢谢亚历克斯。我认为所有答案都是有效的,但经过一番深思熟虑后,我将朝着您设定的方向前进。我将使用一个 BOOL 来了解 FormController 是否以模态方式显示。 (2认同)