4

あるビューから別のビューに問題なくデータを渡すことができます。しかし、これが私が問題に直面している私の状況です。

たとえば ->他のビューにデータを渡す

ViewA->ViewB This working perfectly fine 
ViewB->ViewC This working perfectly fine
ViewC->ViewB Here is the problem.

プッシュセグエを使ってみましたが、ViewBに移動しますが、戻るボタンを押すと、ViewC->戻るボタン-> ViewB->戻るボタン->ViewAに移動します。ViewBから戻るボタンを押すと、ViewAに移動する必要があります。

モーダルセグエを使ってみましたが、ViewBに行きますが、どこにも行けません。

私はiOSを初めて使用するので、これを実現する方法について本当に何も知りませんか?

ViewCからViewBにデータを戻す方法は?

私はあなたたちが私を助けることができると思います。

編集

ビューAでは、このようにViewBを呼び出しています

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"RemixScreen"])
{

    if([self.recipeFrom isEqualToString:@"ViewB"])
    {

        ViewB *reciepe = [segue destinationViewController];
        //somedata i will pass here

    }  
}
 }

ビューBで私はこのように呼んでいます

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
if([segue.identifier isEqualToString:@"ViewA"])
{  
    ViewA *data = [segue destinationViewController];
    //some data  
}
}

助けてくれてありがとう。

4

3 に答える 3

16

これを行う正しい方法は、デリゲートを使用することです。prepareForSegueのプロパティを使用してデータを転送し、デリゲートを使用してデータを戻します。

それが機能する方法は、prepareForSegueのViewBによって設定されるViewCのデリゲートプロパティを持つことです。このようにして、ViewCは設定したプロトコルを介してViewBと通信できます。

編集:デモンストレーション用のコードを追加します:

ViewControllerBInterface:

@protocol ViewBProtocol

- (void)setData:(NSData *)data;

@end

@interface ViewBController: UIViewController <ViewBProtocol>
...
@end

ここでは、ViewBControllerをViewCControllerが通信するプロトコルに従わせます。

次はViewCControllerインターフェースです。

@interface ViewCController: UIViewController

@property (nonatomic, weak) id<ViewBProtocol> delegate;

...

@end

次に、ViewBControllerのprepareForSegueを見てみましょう。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController* controller = [segue destinationViewController];
    if ([controller isKindOfClass:[ViewCController class]])
    {
        ViewCController* viewCController = (ViewCController *)controller;
        viewCController.delegate = self;
    }
}

ご覧のとおり、デリゲートプロパティを介してViewCコントローラをViewBコントローラにリンクしています。次に、ViewCで何かを実行します。

- (void)sendData:(NSData *)data
{
    [self.delegate setData:data];
}

必要に応じて、ViewCControllerのviewWillDisappearメソッドでこれを使用できます。

于 2012-08-09T15:18:53.447 に答える
2

最近のプロジェクトでこの問題を回避した方法は次のとおりです。

ビューAはであるため、このようにいつでもビューBおよびビューCparentViewControllerからアクセスできます。

ViewAClass *parentView = (ViewAClass *)self.parentViewController;

次に、次のように、ビューAのプロパティの読み取りと書き込みを行うことができます。

NSString *string = parentView.someStringProperty;

また

parentView.someStringProperty = @"Hello World";

編集-「戻るボタンなしでビューBからビューAに戻るには」

[parentView popViewControllerAnimated:YES];
于 2012-08-09T14:39:55.040 に答える
-1

ナビゲーションコントローラーを使用していますか?はいの場合、シングルトンを使用してデータを簡単に渡すことができます。これは、私のお気に入りの方法であり、使いやすい方法でもあります。それ以外の場合、ボタンなどを使用してビューをナビゲートしようとしている場合は、セグエに識別子を設定してから、メソッド「performSegueWithIdentifier」を呼び出してください。

于 2012-08-09T14:38:06.447 に答える