ストーリーボードを使い始めましたが、非常に大きな違いが 1 つあります。前後に移動するたびに、ストーリーボードが新しい ViewController をインスタンス化しているように見えます。例: Master-Detail テンプレートに基づいて 2 つの新しい Xcode プロジェクトを作成します。ケース 1 ではストーリーボードを使用し、ケース 2 では .xib を使用します。
通常、これらは同じように動作することを期待しますが、そうではありません!
両方の DetailViewController.m に、次のメソッドを追加します。
-(void)viewDidAppear:(BOOL)animated{
if (xposition ==0) {
xposition=50;
}else{
xposition = xposition+50;
}
NSLog(@"xposition update %d", xposition);
}
(ヘッダーで xposition を「int」インスタンス変数として宣言しました):
Storyboard バージョンを実行し、「+」をタップして DetailViewController に出入りすると、NSLog ステートメントで「xposition update 50」が表示され続けます。
対照的に、.xib バージョンでは、「位置」が 50 ずつ増加する DetailViewController に出入りするたびに、50、100、150 などのように、期待される動作が得られます。
ストーリーボードを修正して、.xib ベースのバージョンと同じように動作させるにはどうすればよいですか? 具体的には、DetailViewController を 1 回だけインスタンス化したいと考えています。
編集:自分の質問に答えます。私はこれについていくつかの助けを得て、私のために働いた答えを投稿したかった.
最初にセグエを実行するとき、目的のViewControllerをプロパティに保存します(メソッド「PrepareForSegue」を参照してください。私のVCはMyViewControllerと呼ばれます)
次に、「shouldPerformSegueWithIdentifier」というデリゲート メソッドを作成し、これを使用してセグエをインターセプトし、後続のすべてのセグエに対して格納された ViewController を手動で提示します。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIViewController *destination = segue.destinationViewController;
NSLog(@"identifier = %@", [segue identifier]);
if([[segue identifier] isEqualToString:@"mySegue"]) {
self.myViewController = (MyViewController*)destination;
NSLog(@"Saving myViewController for later use.");
}}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if([identifier isEqualToString:@"mySegue"]) {
if(self.myViewController != nil) {
NSLog(@"Using the saved myViewController.");
[self.navigationController pushViewController:self.myViewController animated:YES];
return NO;
}else {
return YES;
}
}
return YES;}