0

セルが選択されているときに、ストーリーボードのセグエを介してRootViewController1またはRootViewController2からプッシュ/入力されるDetailViewControllerがあります。

DetailViewControllerには、が付いたボタンがありますIBAction。次のようなアクションをプログラムできますか?

親ViewControllerがRootViewController2の場合は、を返します。それ以外の場合は、アクションを実行します。このようなもの:

-(IBAction)actionButtonPressed:(id)sender
{
    if (parentViewController == RootViewController2) {
        return;
    }

    //Else this is done:
    textLabel.text = @"Test";
}

しかし、それをどのように機能させるかはわかりません。この例は素晴らしいでしょう。さらに情報が必要な場合はお知らせください。

編集:

コードは次のようになります。

#import "RootViewController2.h"

...

-(IBAction)actionButtonPressed:(id)sender
{
    if([self.parentViewController isKindOfClass:[RootViewController2 class]]) {
        return;
    }

    //Else this is done:
    textLabel.text = @"Test";
}

ただし、アクションは両方のビューから実行されます。さらなる提案?

4

3 に答える 3

1

@Matt が述べたように、View Controller は配列に格納されます。次のように、ナビゲーション コントローラー配列にアクセスできます。

[self.navigationController.viewControllers lastobject ]
[self.navigationController.viewControllers objectAtIndex:2];

You can also get a reference to the parent view controller like this:
self.parentViewController
self.presentingViewController

親への参照を取得する方法に関係なく、その参照を比較する方法が必要です。このようなイントロスペクションを使用できます if ([object isKindOfClass:MyClass class])。しかし、何らかの形で (ビュー コントローラー配列を使用して) そのアプローチでは、各親オブジェクトへのオブジェクト参照が必要です。トリッキーな方法です。

別のより簡単な方法は、-(void)prepareForSegue .... ブロックでセグエする前に、ビュー コントローラーでプロパティ値を設定することです。このようなもの:

 MyClass *myClass = segue.destinationViewController;
 myClass.myLogicProperty = @"mommy";

そして、他のView Controllerからの他のセグエ

MyClass *myClass = segue.destinationViewController;
 myClass.myLogicProperty = @"daddy";

これで、ボタンが押されたときに、それらの値に対して正しいことを行うことができます。

if ([self.myLogicProperty isEqualTo:@"daddy"]) {
   //take action
}
else if ([self.myLogicProperty isEqualTo:@"mommy"]) {
   //take action
}
else {
//do something if no match
}

特定のニーズがわからないので、後者をお勧めし、viewcontrollers 配列を使用しないようにアドバイスします。

それが役立つことを願っています。

于 2012-08-12T22:35:17.730 に答える
1

ビュー コントローラーはUINavigationController、スタック (線形シーケンス) の形でプッシュされます。このスタックをUINavigationController's viewControllers配列として取得できます。(UINavigationControllerプッシュされたビュー コントローラーの としてそれ自体を参照できますnavigationController。) この詳細コントローラーはスタックの一番上 (スタックの最後) にあるため、知りたいのは前のコントローラー、つまり次のコントローラーです。配列の最後の項目。

于 2012-08-12T21:57:11.557 に答える
0
#import "RootViewController2.h"

...

-(IBAction)actionButtonPressed:(id)sender
{
#define CurrentParentViewController [[self.navigationController viewControllers] objectAtIndex:[[self.navigationController viewControllers] count] - 2]
if([CurrentParentViewController isKindOfClass:[RootViewController2 class]]) {
    return;
}

//Else this is done:
textLabel.text = @"Test";
}
于 2012-08-12T22:36:29.377 に答える