2

ストーリーボードを使い始めましたが、非常に大きな違いが 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;}
4

1 に答える 1

2

前後に移動すると、ストーリーボードが DetailViewController から飛び出します。他のものによって保持されないため、解放されますが、これは正常な動作です。

インスタンスを保持したい場合は、呼び出し元の ViewController に保持し、後で再度使用する必要があります。については、この質問を確認してください

編集:

問題は解決したと思いますが、例を次に示します。

インターフェースでviewcontrollerのプロパティを作成します。myViewController

prepareForSegue メソッドで viewcontroller を保持します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    [self setMyViewController:[segue destinationViewController]]; 
}

これはメモリリークではありません。例によってはリークする可能性があります。こちらのガイドをご覧ください。

次にシークが実行されるときに、プロパティがすでに設定されているかどうかを確認し、設定されている場合はそれを使用します。

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if([self myViewController] != nil){
        [[self navigationController] pushViewController:[self myViewController] animated:YES];
        return NO;
    }else{
        return YES;
    }
}
于 2012-11-01T21:57:19.893 に答える