2015-03-02 25 views
6

Tôi gặp phải rất nhiều sự cố khi xử lý luồng đăng nhập của ứng dụng iOS. Một hình ảnh của các kịch bản tôi đang cố gắng để đạt được là dướiMàn hình đăng nhập bằng Swift và iOS 8 Bảng phân cảnh

enter image description here

tôi đang cố gắng để đạt được một màn hình đăng nhập tùy chọn được trình bày chỉ khi người dùng đầu tiên mở ứng dụng và chưa đăng nhập. Hiện nay, tôi có Bộ điều khiển Thanh tab được đặt làm bộ điều khiển chế độ xem gốc. Tôi không thể tìm ra cách xử lý trao đổi giữa các bộ điều khiển xem này, tuy nhiên.

Tôi đã cố gắng chỉ cần đẩy màn hình đăng nhập bằng mã sau đây. Tuy nhiên, nó không hoạt động. Tôi tin rằng vấn đề là một bộ điều khiển thanh tab không được phép đẩy bộ điều khiển xem mới.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    //stuff 

    if userLoggedIn { 
     // Do nothing 
    } else { 
     //get access to login view 
     var storyboard = UIStoryboard(name: "Main", bundle: nil) 
     var viewController = storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController; 

     // Then push login view 
     var rootViewController = self.window!.rootViewController as UITabBarController; 
     rootViewController.pushViewController(viewController, animated: true) 
    } 

    // Override point for customization after application launch. 
    return true 
} 

Có cách nào để chuyển đổi bộ điều khiển chế độ xem mà không cần đẩy trong bộ điều khiển điều hướng không? Bất kỳ lời khuyên nào về cách xử lý loại lưu lượng đăng nhập này sẽ được đánh giá cao.

+0

Đó là toàn bộ didFinishLaunchingWithOptions phương pháp mã của bạn? Bạn đang chuyển sang bộ điều khiển đầu tiên của mình như thế nào nếu người dùng đăng nhập? Tôi đoán nó đang được thực hiện tự động với bảng phân cảnh ... trong trường hợp đó, bạn đang cố đẩy chế độ xem đăng nhập này vào vị trí sai trong mã của bạn ... –

Trả lời

5

Tôi đạt được điều này với một "LaunchViewController" để xác định xem nó có nên hiển thị chế độ xem Đăng nhập hoặc trình điều khiển điều hướng chính hay không.

Đánh dấu chế độ xem khởi chạy chế độ xem ban đầu của bạn trong bảng phân cảnh và viết logic trong đó để xác định xem sẽ hiển thị cái gì. Quá trình này thường rất nhanh và không đáng kể đối với người dùng.

CẬP NHẬT:

Như đã đề cập trong bình luận của tôi, tôi đã đi theo một hướng khác. Bây giờ trong phương thức application(application:didFinishLaunchingWithOptions:) của App Delegate, tôi thực hiện logic cần thiết để xác định chế độ xem nào là rootViewController và đặt nó ở đó bằng cách sử dụng các bước sau.

extension AppDelegate { 

    enum LaunchViewController { 
     case Login, Dashboard 

     var viewController: UIViewController { 
      switch self { 
      case .Login: return StoryboardScene.Login.LoginScene.viewController() 
      case .Dashboard: return StoryboardScene.Dashboard.initialViewController() 
      } 
     } 

     /// Sets `UIWindow().rootViewController` to the appropriate view controller, by default this runs without an animation. 
     func setAsRootviewController(animated animated: Bool = false) { 
      let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
      let window = appDelegate.window! 
      let launchViewController = viewController 

      log.info?.message("Setting \(launchViewController.dynamicType) as rootViewController") 
      if let rootViewController = window.rootViewController where rootViewController.dynamicType != launchViewController.dynamicType && animated { 
       let overlayView = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false) 
       launchViewController.view.addSubview(overlayView) 

       UIView.animateWithDuration(0.3, animations: { 
        overlayView.alpha = 0.0 
        }, 
        completion: { _ in 
         overlayView.removeFromSuperview() 
       }); 
      } 

      window.rootViewController = launchViewController 
      window.restorationIdentifier = String(launchViewController.dynamicType) 

      if window.keyWindow == false { 
       window.makeKeyAndVisible() 
      } 
     } 
    } 
} 

Lưu ý rằng StoryboardScene không phải là một loại mặc định, tôi đang sử dụng để tạo ra https://github.com/AliSoftware/SwiftGen đó.

Phương thức Ủy quyền ứng dụng của tôi trông giống như thế này.

if window == nil { 
    window = UIWindow(frame: UIScreen.mainScreen().bounds) 
} 

if isRestoringState == false { 
    if let _ = lastUsedAccount { 
     LaunchViewController.Dashboard.setAsRootviewController() 
    } else { 
     LaunchViewController.Login.setAsRootviewController() 
    } 
} 

CẬP NHẬT với phương pháp Thoát for Comment

func handleLogout(notification: NSNotification) { 
    LaunchViewController.Login.setAsRootviewController(animated: true) 
    lastUsedAccount = nil 
} 
+0

Bạn có viết logic để xác định cái nào có trong viewDidLoad() hay bất kỳ nơi nào khác không? – Kaunteya

+0

Tôi đã thực sự đi theo một hướng khác trong một ứng dụng mới mà tôi đang làm việc mà tôi thích hơn. Trong App Delegate trong 'application (application: didFinishLaunchingWithOptions:)' Tôi xác định khung nhìn nào sẽ được trình bày và thiết lập cái nhìn thích hợp là 'rootViewController'. Đã cập nhật câu trả lời của tôi với một số mã mẫu. –

+0

@ChrisWagner Bạn xử lý đăng xuất của người dùng như thế nào? Bạn chỉ cần thay đổi '' '' '' '' '' 'rootViewController' trở lại bộ điều khiển xem' .Login'? Nếu vậy, bạn có trải nghiệm hoạt ảnh kém trong quá trình chuyển đổi không? Tôi dường như có được hình ảnh động lạ khi chuyển đổi trở lại bộ điều khiển xem xác thực sau khi bắt đầu đăng xuất. –

0

Đặt Is Initial View Controller cho LoginViewController.

enter image description here

Remove from AppDelegate.swift và đặt nó trong LoginViewController.

if userLoggedIn { 
     // Do nothing 
    } else { 
     //get access to login view 
     var storyboard = UIStoryboard(name: "Main", bundle: nil) 
     var viewController = storyboard.instantiateViewControllerWithIdentifier("signupView") as UIViewController; 

     // Then push login view 
     var rootViewController = self.window!.rootViewController as UITabBarController; 
     rootViewController.pushViewController(viewController, animated: true) 
    } 

Chạy dự án của bạn.

1

Đây là những gì tôi đã làm và nó hoạt động tốt:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    if (!AppData.sharedInstance.loggedIn) { 
     let signInNavigation = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("SignInNavigationControllerIdentifier") as? UINavigationController 
     self.window!.rootViewController = signInNavigation; 
    } 
    return true 
} 
Các vấn đề liên quan