我正在创建一个应用程序,其主屏幕可以包含三种方案之一。我们称它们为A,B和C.
这些方案的功能与用户界面完全不同。为了讨论,让我们说每个场景都是一种独特的逻辑难题,并且它们之间没有共同的UI元素,逻辑或功能。
因此,我希望在自己的ViewController中实现每个场景。场景将以模式方式显示在“主菜单”上,因此主菜单会调用[self presentModalViewController:ScenarioX animated:YES]以显示场景。
以下是问题:每个场景都会有一个特定的UI,这些UI在它们之间很常见 - 例如,屏幕顶部状态栏中的倒计时时钟。这个常见的UI将有自己的逻辑,尽管很少。它显然必须运行倒计时时钟,当时钟运行时可能会显示“time up”信息,并响应关闭模态ViewController并返回主菜单的“后退”按钮。
在代码重用,内存管理等方面实现这一目标的最佳方法是什么?
我很欣赏一定程度的技术特异性,而不仅仅是“方法”。例如,如果正确的答案是将状态栏/时钟创建为UIView的子类,然后以编程方式将其添加到Scenario的视图中,那么这是否意味着Scenario的ViewController必须运行时钟,后退按钮和那么?
或者是否可以创建一个管理状态栏,时钟等的StatusClock ViewController,并将THAT添加为Scenario视图的子视图?
答案 0 :(得分:2)
为此,只要我正确地解释了您的问题,您所说的就是您有3个共享一些次要功能的对象。我要做的是将常用功能抽象为基类,然后让其他3个类继承自基类。
所以你有ScenarioBase,它具有常用功能,如timer属性,startTimer函数,stopTimer函数,倒计时函数,startingTime变量,然后可能是completedScenario的委托协议(这会调用你的模态视图控制器上的dismiss)
@protocol CompletedScenarioDelegate : NSObject
-(void)scenarioIsComplete;
@end
@interface ScenarioBase : UIViewController <CompletedScenarioDelegate> {
NSTimer *timer;
int startingTime;
}
@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic, readwrite) int startingTime;
-(void)startTimer;
-(void)stopTimer;
-(void)countdown;
@end
现在您有3个要实施的方案。
类定义可能看起来像
@interface Scenario1 : ScenarioBase {
UIImageView *puzzleBackground; //I don't really know what you want as members
//Lets say this is a custom background for the puzzle
}
@end
然后,您实现自定义拼图的代码,在其init中设置其startingTime,调用其继承的startTimer函数,然后就可以了。您可以在scenarioIsComplete的父类中实现默认功能,可能类似于
-(void)scenarioIsComplete {
UIViewController *vc = [(ScenarioAppDelegate)([[UIApplication sharedApplication] delegate]) viewController];
[vc dismissModalViewController];
}
这将解决所有儿童情景的解雇。