2017-05-30 71 views
2

我使用標籤欄項目來製作像Instagram這樣的應用程序。在應用程序中,我有simple usercompany user如何在swift ios中刷新標籤欄項目

我主視圖控制器:

MainTabBarController: UITabBarController 

5個標籤欄項目。而且每個項目都有自己的ViewController

我需要刷新MainTabBarController當用戶Simple user它是5項,當用戶爲Company user它是4個項目。如何刷新或重新加載沒有關閉應用程序?

我已經用UserDefaults做了一個解決方案,但需要關閉應用程序。

平臺的iOS> 9.0,雨燕3.0

回答

0

我得到了解決辦法: 我分了我的MainTabBarController到3類:

  1. AnonymUserTabBarController。設置5個標籤欄項目。
  2. SimpleUserTabBarController。設置5個標籤欄項目。
  3. CompanyTabBarController。設置4個選項卡欄項目。

而改變動畫UI用戶:

func selectCompanyUser() { 
    guard let window = UIApplication.shared.keyWindow else { 
     return 
    } 

    guard let rootViewController = window.rootViewController else { 
     return 
    } 

    let viewController = CompanyTabBarController()   
    viewController.view.frame = rootViewController.view.frame 
    viewController.view.layoutIfNeeded() 

    UIView.transition(with: window, duration: 0.6, options: .transitionFlipFromLeft, animations: { 
     window.rootViewController = viewController 
    }, completion: nil) 
} 
2

使用setViewControllers(_:animated:)

myTabBarController.setViewControllers(myViewControllers, animated: true) 
+0

我覺得第一行是不夠..:d。它只是看起來如此小的答案,導致你添加另一行。 – rptwsthi

+1

只是確保:D –

-1

您可以張貼通知,根據用戶類型刷新選項卡,首先設置觀察員MainTabBarController,一旦通知檢查用戶類型並刷新標籤

extension Notification.Name { 
    static let refreshAllTabs = Notification.Name("RefreshAllTabs") 
} 

class MainTabBarController: UITabBarController, UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(forName: .refreshAllTabs, object: nil, queue: nil) { (notification) in 
      //check if its a normal user or comapny user 
      if AppUser.shared.type == .normal { 
       self.viewControllers = [VC1, VC2, VC3, VC4, VC5] 
      } else { 
       self.viewControllers = [VC1, VC2, VC3, VC4] 
      } 
     } 
    } 

    deinit { 
     NotificationCenter.default.removeObserver(self) 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

now for post荷蘭國際集團每當用戶類型的變化只是叫

NotificationCenter.default.post(Notification(name: .refreshAllTabs)) 
+0

wuuu在那裏保留這些通知,你可以讓自己陷入非常糟糕的境地。 –

+0

這是解決問題的方法之一,它是一種標準的蘋果設計模式。你能解釋一下爲什麼這種情況不好嗎? – suhit

+0

看到我上面的答案。當我有時間時,我可以通過委託來擴展方法。 –

0

通常通知真的不是在所有SWIFTY通知,斯威夫特鼓勵所有程序員使用過通知協議...什麼有關委託或設立didSet選項變量?根本不需要通知。我想,是的TabBar在登錄後立即推,所以你只要把類變量,右didSet設置的viewControllers:

///Considering UserType is enum with cases: 
var currentUserType: UserType{ 
didSet{ 
currentUserType = .company ? self.viewControllers = /*array with 5 count*/ : self.viewControllers = /*array with 4 counts*/ 
} 
} 

,現在根據viewControllers其餘的只是處理。