web-dev-qa-db-ja.com

Swift iosでタブバーアイテムを更新する方法

私はタブバーアイテムを使ってInstagramのようなアプリをやっています。アプリにはsimple usercompany userがあります。

私はメインのViewControllerを持っています:

MainTabBarController: UITabBarController

5つのタブバーアイテム付き。そして、各アイテムには独自のViewControllerがあります

ユーザーがSimple userの場合は5アイテム、ユーザーがCompany userの場合は4アイテムの更新MainTabBarControllerが必要です。アプリを閉じずに更新または再読み込みするにはどうすればよいですか?

私がすでにUserDefaultsで行っている解決策のひとつですが、アプリを閉じる必要があります。

プラットフォームiOS> 9.0、Swift 3.

7
Zhanserik

私は解決策を得ました:私は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)
}
1
Zhanserik

setViewControllers(_:animated:) を使用します

myTabBarController.setViewControllers(myViewControllers, animated: true)
4
Jože Ws

通知を投稿して、ユーザータイプに基づいてタブを更新できます。まず、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.
    }

}

ユーザータイプが変更されるたびに通知を投稿するために、

 NotificationCenter.default.post(Notification(name: .refreshAllTabs))
0
Suhit Patil

通常、通知は実際にはまったく迅速ではありません。Swiftは、すべてのプログラマーが通知を介してプロトコルを使用することを推奨します...委任または変数の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に従って残りを処理するだけです。

0
Dominik Bucher