ViewControllerがリセットされるのを防ぐ-uinavcontroller + Storyboard + Segue's
-
25-10-2019 - |
質問
次の「問題」に対して「正しい」ソリューションを選ぶのに助けが必要です。
新しいストーリーボード機能を使用して、アプリケーションのすべての画面をリンクします。基本的に構造は次のように掘削します。
ナビゲーションコントローラー] => [コントローラー#1を表示] => [Tabbarコントローラー] => [コントローラー#2を表示]*
**(そして今のところ重要ではない他のいくつかのタブ)*
最初のビューコントローラー(#1)からタブバーコントローラーの背後にあるビューコントローラーにセグエ(プッシュ)を添付しました。このプッシュは、ユーザーが最初のコントローラーで何かを押して正常に動作するとトリガーされます。
// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];
ユーザー(現在はView Controller#2にある)がNavbarのバックボタンを押すと、ユーザーが戻ります。彼が再びセグエをトリガーしたとしたら、2番目のビューコントローラーが再び表示されますが、今では「リセット」されています(空)。 (いくつかのフォーラと記事を読んだ後、これはセグエの使用時に標準的な動作であると思います。
2番目のビューコントローラーの内容が動的であるため(サーバーからのJSON応答に依存します)、これは問題を引き起こします。ユーザーが戻ってきます。
同じ問題を説明しているいくつかのソース(底を参照)を見つけましたが、解決策は異なり、正しいものを選ぶのに何らかの助けが必要です。
要約:
- ユーザーが押し戻したときに「保持する」/ビューコントローラーの状態を保存するにはどうすればよいですか。
自分の考え:
#1 私は今、私のシングルトンクラスへのJSON応答を(そしてそこからプリストまで)キャッシュし、このデータが存在しているかどうかを2番目のビューコントローラー内でチェックすることを考えており、その後のビューを再構築するよりも、新しいデータを確認します(通常の再開通常の再開手術)。
#2 私が考えているもう1つは、セグエを「バイパス」し、部分的に説明されているビューのスイッチを手動で処理することです()ストーリーボード - AppDelegateのViewControllerを参照してください) - これも可能ですか?
しかし、多分より簡単な/より良いオプションがありますか?
http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html ストーリーボード - AppDelegateのViewControllerを参照してください uiviewをシリアル化する方法は?
解決 2
将来この(私の)質問に出くわす人にとって、これが私がそれを「コーディング」する方法です。
ストーリーボードを開き、「タブバーコントローラー」を選択し、属性インスペクターを開きます
フィールドの「識別子」を入力します
最初のビューコントローラー(元の投稿のシナリオを参照)では、ViewControllerへのグローバル参照を作成します。
FirstViewController.H
@interface YourViewController : UIViewController {
UITabBarController *tabController;
}
FirstViewController.M
//Fill the reference to the tabcontroller using the identifier
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
次に、FirstViewControllerから切り替えるには、次の行を使用できます。
[[self navigationController] pushViewController:tabController animated:YES];
他のヒント
ええ!解決策を手に入れました。以下をせよ:
あなたは.hファイル:
@property (strong, nonatomic) UITabBarController *tabController;
あなたは.mファイル:
@synthesize tabController;
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
選択したインデックスはあなたが行きたいタブです
tabController.selectedIndex = 1;
[[self navigationController] pushViewController:tabController animated:YES];
これはさらに単純なソリューションかもしれません(プロパティを使用せずに - 実際、すべてのクラスインスタンスは宛先コントローラーについて知る必要はないため、プッシュ機能の静的として保存するだけです):
static UIVewController *destController = nil;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
if (!storyboard) {
DLog(Storyboard not found);
return;
}
if (destController == nil) { //first initialisation of destController
destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"];
if(!destController) {
DLog(destController not found)
return;
}
}
//set any additional destController's properties;
[self.navigationController pushViewController:destController animated:YES];
詩 DLog
私のバリエーションです NSLog
.
しかし、セグエでこれを行う方法は本当に面白いですか?