2012-12-17 51 views
2

民間,UIView登錄屏幕到標籤頁邏輯

我遇到了一些導航邏輯的麻煩。目前我有一個簡單的兩個tabbar tabbar應用程序。但我想在前面顯示一個登錄屏幕。所以這將是一個UIView。

目前的代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    UIViewController *viewController1 = [[roosterViewController alloc] initWithNibName:@"roosterViewController" bundle:nil]; 
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 

    self.tabBarController = [[UITabBarController alloc] init]; 
    self.tabBarController.viewControllers = @[viewController1, viewController2]; 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

所以這推動一個簡單的tabcontroller。那麼,現在我想要一個登錄屏幕。所以這將是一個簡單的UIView推動tabbar控制器。但我似乎無法看到如何做到這一點的邏輯。

我一直在試圖提出一個模態視圖控制器,但事情是:使用TabBar將在後臺加載。因爲我需要用戶名/密碼信息才能在tabbarview上工作,所以這不起作用。

我的邏輯是:

委託>負載loginViewController>負載的TabBar控制器

但是,我需要能夠爲 「註銷」。所以我需要銷燬tabbar控制器並顯示登錄屏幕。

對此有何看法?

回答

1

你可以做這樣的事情:

你可以創造出你的AppDelegate遵循的協議。

@protocol Authenticator <NSObject> 
@required 
- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password; 
- (bool)authenticated; 
@optional 
- (void)authenticationSuccess; 
- (void)authenticationFailure; 

...

@interface AppDelegate : UIResponder <UIApplication, Authenticator> 
@property (readonly, nonatomic, assign) bool loggedIn; 

...

@implementation AppDelegate 
@synthesize loggedIn = _loggedIn; 

- (void)authenticateWithUsername:(NSString *)username andPassword:(NSString *)password 
{ 
    //if success 
     _loggedIn = YES; 
    //check if app responds to the optional authenticateSuccess method 
    //call it if it does 
    //else fail 
     //do stuff 
} 

- (bool)authenticated 
{ 
    if (_loggedIn != NULL) { 
     return _loggedIn; 
    } 
    //do other stuff 
} 

...

我在適當的Objective-C的約定和語法有點模糊所以請原諒我如果我有一些錯誤,但無論如何,這是一些邏輯和僞代碼的工作。調整到您的需求。

我希望這會有所幫助。

編輯:

我想我的答案有點未完成。在我看來,你的問題的答案與某種認證結構密切相關。如果您的應用程序與身份驗證緊密連接,那麼爲什麼不通過身份驗證結構來控制它的流程。我想這是我的觀點,因爲所有這些都可以方便地在您的應用程序委託中使用,所以您可以在任何需要的地方調用這些方法,因此讓您的身份驗證邏輯可以決定要顯示哪個視圖控制器。

+0

同樣,您可以在協議中註銷,並在適當的時間對所有可選方法進行相應的調用。 – Ben

+0

接受答案有點遲,完全忘了接受這個答案。謝謝! –

0

我建議您以root身份設置登錄屏幕。當登錄成功時,只需將窗口的根目錄更改爲TabBar控制器,並使用一個很好的動畫。

+0

你也許有一個小代碼樣本給我? –

+0

我不會和我在一起。也許明天 – Levi

0

我會建議您設置標籤欄就像你擁有它的權利,但緊隨makeKeyAndVisible您實例並提出登錄視圖控制器,無需動畫。

這樣一旦應用程序已經啓動,用戶不會看到tabBarController,但只有模態呈現登錄屏幕。一旦登錄完成,你只需關閉登錄視圖控制器,並在它下面出現.... drumroll tabbarcontroller!

+0

哈哈,我喜歡你講述你故事的方式。但是,有一個但是:我一直在試圖呈現一個模式視圖控制器,但事情是:tabbar將被加載在背景上。因爲我需要用戶名/密碼信息才能在tabbarview上工作,所以這不起作用。 那麼有什麼辦法可以從模態控制器調用「roosterViewController」中的函數 –

+0

您可以讓viewControllers爲空,直到您擁有憑證並在解除登錄VC之前填充viewControllers數組。 – Cocoanetics

+0

所以基本上,做到:self.window.rootViewController = self.tabBarController;解除modalvc?我得到一個警告:「應用程序窗口預計將有一個根視圖控制器在應用程序啓動結束」 –

1

正如前面提到的登錄作爲rootView,如果登錄成功啓用其他tabbarButtons其他不啓用他們像這樣..初始設置爲視圖加載布爾假如果成功啓用一個標籤欄按鈕其他「T。

login = TRUE; 


UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2]; 
[reportit setEnabled:TRUE]; 

else { 

UITabBarItem *reportit = [[[[self tabBarController]tabBar]items] objectAtIndex:2]; 
[reportit setEnabled:FALSE]; 

}

0

擴展在Levi's answer,這是你如何連續地切換根視圖控制器(與動畫)。只需添加此擴展名:

extension UIViewController 
{ 
    func transitionToRootViewController(viewController:UIViewController) 
    { 
     UIView.transitionWithView(self.view.window, 
      duration: 0.3, 
      options: UIViewAnimationOptions.TransitionCrossDissolve, 
      animations: { 
       window.rootViewController = viewController 
      }, 
      completion: nil 
     ) 
    } 
} 

...到UIViewController類(這將使transitionToRootViewController()提供給所有您的視圖控制器的方法),並調用它退出的視圖控制器上,傳遞進入視圖控制器(也許你實例化了一個單獨的故事情節,誰知道......)作爲參數。

(基本思想是從here採取予簡化了碼的位。)

雖然小心:我嘗試這樣做代碼插入標籤欄控制器,其選擇的索引(標籤)含有導航控制器。在過渡動畫過程中,導航控制器的導航欄「下拉」狀態欄(載體,時鐘,電池電平),並且只有在過渡動畫完成後,纔會立即「跳」到它的位置,從而產生可怕的干擾(和未拋光)影響。

我通過添加以下代碼嵌入在導航控制器的子視圖控制器固定它:(該修復程序從this forum採取)

override func viewWillAppear(animated: Bool) 
{ 
    super.viewWillAppear(animated) 

    self.navigationController?.navigationBar.layer.removeAllAnimations() 
    //^THIS 
} 

我沒有檢查,但是無論您是否將其嵌入到標籤欄控制器中,只要轉換到導航控制器(或任何碰巧附有導航欄的普通香草UIViewController)中,就會出現同樣的問題。