возвращаясь к AppDelegate, чтобы воссоздать контроллер uitabbar - PullRequest
0 голосов
/ 22 июля 2011

У меня есть приложение, основанное на представлении панели вкладок с экраном приветствия (которое ведет к входу в систему или регистрации). в основном, если вы вошли в систему - вы переходите прямо к представлению панели вкладок, а если нет, вы переходите к экрану приветствия, где вы можете выбрать либо войти, либо зарегистрироваться. Предполагая, что вы войдете в систему или войдите в систему, я бы хотел, чтобы представление панели вкладок появилось снова, однако все объявления находятся в AppDelegate. как я могу "вернуться" и вызвать tabbatcontroller? правильна ли структура / поток моих занятий?

так повторить:

  1. пользователь вошел в систему -> первый вид - это вид панели вкладок
  2. пользователь вышел из системы -> экран приветствия -> экран входа в систему / вверх -> вид панели вкладок

я ищу, что мне нужно написать в этом методе действия, который вызывается, когда пользователь нажимает «войти» на странице входа:

-(IBAction)done:(id)sender {

?????

}

для справки, мой appDelegate:

  if(user signed in)
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController1 = [[FirstTab alloc] initWithNibName:@"FirstTab" bundle:NSBundle.mainBundle];
UIViewController *viewController2 = [[SecondTab alloc] initWithNibName:@"SecondTab" bundle:NSBundle.mainBundle];
UINavigationController *secondNavController = [[UINavigationController alloc]initWithRootViewController:viewController2];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, secondNavController, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];

}
else
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    SigninTabBarTemplateViewController *landingPage = [[SigninTabBarTemplateViewController alloc] initWithNibName:@"SigninTabBarTemplateViewController" bundle:nil];
    self.window.rootViewController = (UIViewController *) landingPage;            
    [self.window makeKeyAndVisible];   
}

Ответы [ 2 ]

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

Есть много вариантов, которые вы можете рассмотреть.

Этого легко достичь, используя делегат . Если вы хотите закрыть виртуальный канал, который вы представили модально, присвойте ему свойство delegate. При необходимости делегату будет отправлено сообщение, позволяющее отклонить ВК. Хороший способ использовать делегат - написать собственный протокол.

Например:

// the delegate will conform to this protocol
@protocol SignInVCDelegate

// this method will be called when required
//
-(void)signInCompleted;

@end

Теперь приведите нужный объект в соответствие с этим протоколом, например, делегат приложения.

// .h
#import "SignInVCDelegate.h"

@interface YourAppDelegate : NSObject <..., SignInDelegate> {
    ...
    SignInVC *signIn;
    ...
}

-(void)signInCompleted;

@end

Реализация выглядит следующим образом:

// .m
...
-(void)signInCompleted {
    ...
    [signIn.view removeFromSuperview];
}

-(BOOL)applicationDidFinishLaunching {
    if(!logged) {
        ...
        [signIn setDelegate:self];
        [self.tabBarController presentModalViewController:signIn
                                                 animated:YES];
    }
}

Теперь присвойте signInVC свойство делегата, которое будет установлено до того, как оно будет представлено модально, и отправьте делегату сообщение после завершения входа в систему.

// in .h
@property(retain) id <SignInDelegate>delegate;

// in .m
@synthesize delegate;

-(IBAction)validateSignIn {
    ...
    [delegate signInCompleted];
}

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

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

// in app delegate .m
-(BOOL)applicationDidFinishLaunching {
    ...
    [[NSNotificationCenter defaultCenter]
     addObserver:self
        selector:@selector(signInCompleted)
            name:@"UserSignedInNotification"
          object:nil];
}

// in SignInVC.m
-(IBAction)validateSignIn {
    ...
    [[NSNotificationCenter defaultCenter]
     postNotificationName:@"UserSignedInNotification"
                   object:self];
}

Дополнительные сведения о делегатах и ​​уведомления в Общение с объектами .

1 голос
/ 22 июля 2011

Вы можете попробовать сделать что-то подобное в методе, в котором вы знаете, что пользователь успешно вошел в систему. (Предполагая, что SignedInTabbarViewController - ваш TabBarController)

   SignedInTabbarViewController *signedInTabbarViewController = [[SignedInTabbarViewController alloc] init];
   id mainDelegate = [[UIApplication sharedApplication] delegate];
   [self.navigationController.view removeFromSuperview];
   if( [mainDelegate respondsToSelector:@selector(setViewController:)]) {
       [mainDelegate setViewController:signedInTabbarViewController];
   }
   UIWindow   *mainWindow = [mainDelegate window];
   [mainWindow addSubview: signedInTabbarViewController.view];
  [signedInTabbarViewController release];
...