2011-05-12 48 views
0

我有一个父类DocViewController(从UIViewController的继承)和2个亚类:的iOS:与UIViewController的亲子班更好的设计

  • PhotoViewController
  • 的MapViewController

在父类( DocViewController)我有以下代码:

if ([previousView isKindOfClass:[PhotoViewController class]] || [previousView isKindOfClass:[MapViewController class]]) { 

       [viewControllers removeObjectAtIndex:[viewControllers count] - 2]; 
       self.navigationController.viewControllers = viewControllers; 
       [viewControllers release]; 

} 

我正用它从UINavigationView堆栈中删除子类。 (无论如何,这不是问题的关键:我有一个分段控件,我在推这样的类,但我仍然希望我的“后退”按钮忽略它们)。

它的工作原理。我唯一的问题是,它不是非常面向对象的,因为父类为if语句导入了子项。对 ?

谢谢

回答

2

是的,它不是很面向对象。最好在类上实现一个方法。也许像

-(BOOL)shouldPopTwo; 

然后

if ([previousView shouldPopTwo]) { ... } 

,然后将每个子类可以实现,因为它需要。

在大多数情况下,我认为你应该避免的诱惑,建立类层次结构与UIViewControllers。控制器通常是MVC设置中最不可重用的对象,因为它们旨在非常明确地定义行为并将其映射到特定的模型对象。当然,可以构建层次结构(就像他们在SDK中一样),但是结构,功能和抽象需要非常谨慎地规划和构建。

相反,您应该创建可重用的UIViews,然后实现不同的UIViewControllers来定义应用程序应该如何使用和响应这些视图。

针对以下意见:

听起来像是你可能会尝试使用它的目的不是一种方式,导航控制器,实际上你的最后两个视图控制器应该是一个单一的视图控制器。视图控制器主要用于管理全屏幕内容的价值。如果我理解正确,就你的情况而言,你有一个应该保持在屏幕上的分段控件,并负责切换剩余可用空间中的内容。我建议你有一个单一的视图控制器,它的视图将包含分段控件和一个'画布',它将用于显示替代视图。视图控制器将持有对它正在管理的视图的引用,以便它可以切换它们进出(如果你想要UINavigationController风格的动画,你必须自己实现)。

最后,您需要决定:单个视图控制器可以充当两个子视图的控制器吗?还是应该每个视图都有自己的控制器?如果这个UIViewController子类是一次性的,并且它只用于这两个视图(比如说PhotoMapViewController),你可以选择第一个更简单的选项。如果你想让它适用于任何UIView(比如SegmentedControlViewController),那么每个视图都应该有它自己的NSObject控制器(不是UIViewController)。从Apple文档:

注意:如果你想视图 层次划分成多个子区域和 单独管理每一个,使用 通用控制器对象(从NSObject的下降定制 对象) 而不是视图控制器对象 管理每个分区。然后使用单个的视图控制器对象来管理通用控制器对象的 。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html

但这需要多得多的抽象和设置。

如果总体目标是(我猜)地图的照片集,在第一种情况下在调用视图控制器,你可能有类似的代码:

NSArray *photoCollection = model.myPhotos; 
PhotoMapViewController *pmViewController = [[[PhotoMapViewController alloc] initWithPhotoCollection:photoCollection] autorelease]; 
[self.navigationController pushViewController:pmViewController]; 

和PhotoMapViewController:UIViewController中会负责创建和初始化其分段控制管理的两个视图。

我不会进入第二种情况的代码,因为它更详细。

最后,看看赞成构造而不是继承的OOP原则,以了解更广泛的视角,说明为什么你可能会这样做而不是第一次实现。

任何时候你开始建立一个类层次结构,你应该问问自己 - 它真的是一个子类吗?然后停下来问问自己 - 不用等,它真的是一个子类吗? :) 祝你好运!

+0

@Ball我明白了。那么我的子类ViewControllers的原因是,我需要设置此:self.navigationItem.titleView = segmentedControl;在每个视图上(我在每个视图的顶部都有一个segmentedControl,当我选择带有匹配索引的按钮时,我用它来推送一个新的viewController)。 – aneuryzm 2011-05-12 14:22:23

+0

顺便说一下,我在问题中发布的代码也应该添加到控制器中,所以我创建的层次结构只是为了不复制此代码而已,仅此而已......您怎么看? – aneuryzm 2011-05-12 14:23:19

+0

大概有一些客户端代码首先推动了这个视图控制器系列。这可能是代码应该去的地方。你能更详细地描述你想要完成的事情吗? – kball 2011-05-12 15:02:46