私はタブバーアイテムを使ってInstagram
のようなアプリをやっています。アプリにはsimple user
とcompany user
があります。
私はメインのViewControllerを持っています:
MainTabBarController: UITabBarController
5つのタブバーアイテム付き。そして、各アイテムには独自のViewController
があります
ユーザーがSimple user
の場合は5アイテム、ユーザーがCompany user
の場合は4アイテムの更新MainTabBarController
が必要です。アプリを閉じずに更新または再読み込みするにはどうすればよいですか?
私がすでにUserDefaultsで行っている解決策のひとつですが、アプリを閉じる必要があります。
プラットフォームiOS> 9.0、Swift 3.
私は解決策を得ました:私はMainTabBarControllerを3つのクラスに分割しました:
そして、アニメーションでユーザー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)
}
setViewControllers(_:animated:) を使用します
myTabBarController.setViewControllers(myViewControllers, animated: true)
通知を投稿して、ユーザータイプに基づいてタブを更新できます。まず、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))
通常、通知は実際にはまったく迅速ではありません。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に従って残りを処理するだけです。