我有一个UIViewController—让我们叫它"FormController"—这是一个简单的形式,编辑对象。我想利用这2种不同的情况:

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

  2. 编辑现有的对象推图控制器上的UINavigationController叠,而不是使用对话的方法。

有细微的差别在于,在该模式的情况我想有一栏与"取消"和"完成"按钮,鉴于堆叠的情况,我想只是有导航条提供的UINavigationController.

这将类似的接触应用程序"的新的联系"和"编辑的联系"屏幕,似乎使用同样的观点控制,但新的接触形式是提出模式而编辑画面被推到导航叠。

我的问题是:什么是最好的方式来处理这两种情况下,没有必要写入2个独立的,但大多相同的观的控制器吗?

我以为关于创建一个"ModalFormController"封装在光秃秃"FormController"通过组成,并增加了一栏,但我读的地方,在文件,苹果不建筑巢图控制器。

有帮助吗?

解决方案

我做什么(有时)设置了一个 enum 指定这种类型的图控制器。

例如,你可能有两种类型:一个 Edit 类型和 Add ("新")的类型。

Add 类型是通过实施一个模式图控制器,同时将 Edit 类型被推到一个现有的导航叠。

在图控制器 -viewDidLoad: 方法,我只是做了 switch/case 树立标题和其他的外貌特征的类型取决于枚举的规定上。

这种做法的好处是,它很容易添加新的类型。缺点是,有条件的树移交这枚举可能获得复杂的迅速,这取决于不同的类型。

switch/case 树,使得它很容易管理。

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

其他提示

为什么不使用子类?让 ModalCreateFormController 一个子类的 EditFormController 和处理模式的特定的东西的子类。

除了具有明确的财产上的图控制器(作为亚历克斯*雷诺兹建议),其他两个方法,这发生我是:

  1. 如果你有某种模型对象,正在编辑,问问它为其目前的状态。如果它曾经保存那你就是在编辑模式。否则,你在创建模式。

  2. 看看值的控制器 parentViewController 财产。如果它是一个实例 UINavigationController, 那你就是在导航叠。如果你正在显示的模式,它将是一个实例清单控制器。

Ug,我讨厌额外的实例变量...

我使用这个代替:

if([[self.navigationController viewControllers] objectAtIndex:0] == self){

        //Modal

    }else{

        //Pushed

    }

它是一个黑,但我们使用的逻辑,即如果违规图控制器是第一个在堆,你不能回去。实际上我们忽略了一个事实是否是模式显示,在所有。

我不得不这样做一堆的时候在我的应用程序,并在尝试一些不同的方式这样做,包括模式类和重新使用模式的辅助课程,使用forwardInvocation.我找到的最好的模式是使containingModalViewController方法的每一个图控制器的(通常的)创建和返回UINavigationController的呼叫者使用与presentModalViewController.

在大多数情况下这种方法构建和返回UINavigationController与自为根视控制器(与反复呼吁的方法,检查自我。navigationController和返回,而不是如果它不是无)。其他情况下我做了一个虚拟根控制器的第一和推入自第二,为了得到一个按钮。然后一招可以用来赶回来按钮按下: http://smallduck.wordpress.com/2010/10/05/intercepting-uinavigationcontroller/

在某些情况下查看并不需要一个导航条,所以这种方法只是调整一些标志和返回自己。我甚至找到了在某些情况下,确实需要一个导航栏是简单的做法援引自我。图,然后调整的观层次结构中添加一个UINavigationBar并再次返回自我。但在任何情况下,安装通常孤立的,这一方法,呼叫者处理,它同样在每一种情况。

苹果解释了如何接触应用程序的工作的发动机罩下:

以允许一定义视图控制器类是用于显示和编辑内容、复盖 setEditing:animated: 法。

你会得到一些功能是免费的,例如 Edit/Done 按钮。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top