【问题标题】:Best approach to have a common overlay across many screens in an iPhone application?在 iPhone 应用程序的多个屏幕上进行通用覆盖的最佳方法?
【发布时间】:2014-07-05 20:44:25
【问题描述】:

我正在创建一个应用程序,其主屏幕可以包含三个场景之一。我们称它们为 A、B 和 C。

这些场景的功能大不相同,用户界面也是如此。为了讨论,假设每个场景都是一种独特的逻辑难题,并且它们之间没有共享共同的 UI 元素、逻辑或功能。

因此,我希望每个场景都在其自己的 ViewController 中实现。场景将在“主菜单”上模态显示,因此主菜单会调用类似 [self presentModalViewController:ScenarioX animated:YES] 的内容来显示场景。

问题是:每个场景都会有一个特定的用户界面,这些界面在它们之间是通用的 - 例如,屏幕顶部状态栏中的倒计时时钟。该通用 UI 将有其自己的逻辑,尽管很少。它显然必须运行倒计时时钟,也许在时钟运行结束时显示“时间到了”消息,并响应关闭模态 ViewController 并返回主菜单的“返回”按钮。

在代码重用、内存管理等方面实现这一点的最佳方法是什么?

我会欣赏一定程度的技术特异性,而不仅仅是一种“方法”。例如,如果正确的答案是将状态栏/时钟创建为它自己的 UIView 子类,然后以编程方式将其添加到场景的视图中,很好:这是否意味着场景的 ViewController 必须运行时钟、返回按钮和等等?

或者是否可以创建一个 StatusClock ViewController 来管理状态栏、时钟等 - 并将其添加为场景视图的子视图?

【问题讨论】:

    标签: iphone ios uiviewcontroller


    【解决方案1】:

    为此,只要我正确解释了您的问题,您的意思是您有 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];
    
    }
    

    这将处理所有子场景的解雇。

    【讨论】:

    • 谢谢。我想我已经完成了一半,我总是忘记协议。我脑子里的 .NET 太多了。这为我结束了循环,感谢您提供的具体示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多