iPhone-объект, который существует для всей сессии приложения - PullRequest
0 голосов
/ 07 сентября 2011

Я относительно новичок в разработке для iPhone, поэтому прошу прощения за то, что я надеюсь, что это простая задача / вопрос.

У меня есть приложение с панелью вкладок с несколькими представлениями, каждое из которых контролируется группой MVC.При загрузке приложения отображается первая группа вкладок mvc.В методе viewDidAppear этого первого контроллера представления у меня модально отображается экран входа в систему так:

- (void ) viewWillAppear:(BOOL)animated
{
    LoginViewController *loginvc = [[LoginViewController alloc] init];
    loginvc.delegate = self;
    if (*xxxxx*) {
        [loginvc setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
        [self presentModalViewController:loginvc animated:NO];  
    }
    [loginvc release];
}

Для условного оператора if я бы хотел, чтобы вызывался метод, который проверяет, вошел ли пользователь в систему.Я временно (только для целей тестирования) разместил этот метод в контроллере представления loginvc, однако это не может быть долгосрочным решением, так как loginvc освобождается после его закрытия (модальное представление).

Нав тот момент, когда у меня есть класс, настроенный следующим образом, но я не знаю, правильно ли это, и не знаю, где его создать (это должно быть в моем основном приложении-методе делегата приложения: didFinishLaunchingWithOptions:?), и незнаете, как изменить переменную userIsLoggedIn:

файл LoginClass.h

#import <Foundation/Foundation.h>

@interface LoginClass : NSObject {
    BOOL userIsLoggedIn;
}

-(BOOL)checkIfUserIsLoggedIn;

@end

файл LoginClass.m

#import "LoginClass.h"

@implementation LoginClass

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
        userIsLoggedIn = NO;
    }

    return self;
}

-(BOOL)checkIfUserIsLoggedIn
{
    return userIsLoggedIn;
}

@end

У меня вопрос, как мне создать объектэтот класс, который существует все время, пока приложение живо.Это связано с тем, что при запуске приложения отображается экран входа в систему, но после успешного входа в систему переменная 'userIsLoggedIn' устанавливается в значение 'YES', поэтому при повторном вызове первого mvc экран входа в систему снова не отображается модально.

Надеюсь, я понял смысл и надеюсь, что кто-то может помочь с кодом.Если я подхожу к этому неправильно, пожалуйста, дайте мне знать альтернативные стратегии (например, должен ли я даже вызывать модальное отображение из viewDidAppear первого mvc?).

Заранее спасибо, Энди

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Вы можете использовать шаблон Singleton , который полностью подходит для вашей задачи.

Конечно, вы можете использовать AppDelegate для этого, как предложено ниже (поскольку UIApplication сама по себе является одноэлементной, и, следовательно, AppDelegate - объект, который является делегатом вашего синглтона UIApplication - существует только в одном экземпляре), но так ли это лучше использовать AppDelegate только для тех целей, для которых он предназначен (т. е. делегировать UIApplication, а именно управлять всем, что связано с событиями приложения, такими как переход в фоновый режим или обратно на передний план, запуск, получение push-уведомлений и т. д. ) чтобы код был чистым и читабельным.

Лучше использовать другой выделенный синглтон для каждой службы, которую необходимо реализовать: это лучшая практика проектирования. Например, реализация одноэлементного класса LoginService (см. здесь, в документе Apple, для получения подробной информации о реализации ), который будет содержать метод -(BOOL)loginWithUsername:(NSString*)username password:(NSString*)password; (который проверяет, что ваш логин / pwd в порядке, потенциально связываясь с вашим WebService для этого) свойство @property(readonly) BOOL loggedIn;, возможно @property(readonly) NSString* currentUsername;, если необходимо, и т. д.

3 голосов
/ 07 сентября 2011

App Delegate - это место, где должен быть ваш класс Login.Он всегда доступен для ваших контроллеров представления и «живет» на протяжении всего времени работы вашего приложения.Проверьте документы, чтобы узнать, как получить доступ к вашему Делегату приложений с контроллеров представления.

Ваш класс входа также должен выглядеть следующим образом:

#import <Foundation/Foundation.h>

@interface LoginClass : NSObject {
    BOOL userIsLoggedIn;
}
@property (nonatomic) BOOL userIsLoggedIn;

-(BOOL)checkIfUserIsLoggedIn;

@end


// Implemenatation
#import "LoginClass.h"

@implementation LoginClass
@synthesize userIsLoggedIn;
- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
        userIsLoggedIn = NO;
    }

    return self;
}

-(BOOL)checkIfUserIsLoggedIn
{
    return userIsLoggedIn;
}

@end

Чтобы установить состояние входа, просто выполнитеэто:

[[yourAppDelegateVar instanceOfLoginClass] setUserIsLoggedIn:YES];

или

[[yourAppDelegateVar instanceOfLoginClass] setUserIsLoggedIn:NO];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...