Лучший подход - иметь общее наложение на несколько экранов в приложении для iPhone? - PullRequest
1 голос
/ 12 июля 2011

Я создаю приложение, основной экран которого может состоять из одного из трех сценариев. Давайте назовем их A, B и C.

Функциональность этих сценариев кардинально отличается, как и их пользовательский интерфейс. Для обсуждения предположим, что каждый сценарий представляет собой отдельный вид логической головоломки и что они не имеют общих элементов интерфейса, логики или функциональности между ними.

Поэтому мне хотелось бы, чтобы каждый сценарий был реализован в своем собственном ViewController. Сценарий будет отображаться модально поверх «главного меню», поэтому главное меню будет вызывать что-то вроде [self presentModalViewController: ScenarioX animated: YES] для отображения сценария.

Вот вопрос: каждый сценарий будет иметь определенный бит интерфейса, который является общим для них - скажем, часы обратного отсчета в строке состояния в верхней части экрана. Этот общий пользовательский интерфейс будет иметь свою собственную логику, хотя и минимальную. Очевидно, что он должен будет запустить часы обратного отсчета, возможно, отобразит сообщение «время истекло», когда часы остановятся, и отреагирует на кнопку «назад», которая закрывает модальный ViewController и возвращает в главное меню.

Какой лучший способ реализовать это с точки зрения повторного использования кода, управления памятью и т. Д.?

Я бы оценил уровень технической специфики, а не просто «подход». Например, если правильный ответ - создать строку состояния / часы в качестве своего собственного подкласса UIView, а затем добавить это программно в представление сценария, хорошо: это означает, что ViewController сценария должен запускать часы, кнопку возврата и так далее?

Или возможно создать StatusClock ViewController, который управляет строкой состояния, часами и т. Д., И добавить THAT в качестве подпредставления представления сценария?

1 Ответ

2 голосов
/ 12 июля 2011

Для этого, пока я правильно истолковал ваш вопрос, вы говорите, что у вас есть 3 объекта, которые имеют некоторые незначительные общие функции. Я хотел бы абстрагировать общую функциональность в базовый класс, а затем 3 других класса наследовать от базового класса.

Таким образом, у вас есть ScenarioBase, у которого есть общая функциональность, такая как свойство таймера, функция startTimer, функция stopTimer, функция обратного отсчета, переменная startTime, а затем, вероятно, протокол делегата для completeScenario (это вызывает 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

Затем вы реализуете код для своей пользовательской головоломки, устанавливаете ее startTime в его init, вызываете его унаследованную функцию startTimer и все готово. Вы можете реализовать функциональность по умолчанию в родительском классе для sceneIsComplete, возможно, что-то вроде

-(void)scenarioIsComplete {
     UIViewController *vc = [(ScenarioAppDelegate)([[UIApplication sharedApplication] delegate]) viewController];

     [vc dismissModalViewController];

}

и это будет обрабатывать увольнение для всех дочерних сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...