0

I have a DetailViewController, which is pushed/entered from RootViewController1 OR RootViewController2 through storyboard segues when Cell is selected.

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

视图控制器被推入UINavigationController一个堆栈(线性序列)的形式。您可以将此堆栈作为UINavigationController's viewControllers数组获取。(您可以将其UINavigationController本身称为推送的视图控制器navigationController。)由于此详细控制器位于堆栈的顶部(堆栈的末尾),因此您想了解的是前一个 - 下一个 -数组的最后一项。

于 2012-08-12T21:57:11.557 回答
1

正如@Matt 提到的,视图控制器存储在一个数组中。您可以像这样访问导航控制器数组:

[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

无论您如何获得对父级的引用,您仍然需要有一种方法来比较该引用。如果 ([object isKindOfClass:MyClass class]),您可以像这样使用内省。但是以某种方式(使用视图控制器数组),您需要对每个父对象的对象引用。这是一个棘手的方法。

另一种可能更简单的方法是在视图控制器中设置一个属性值,然后再在 -(void)prepareForSegue .... 块中使用它。像这样的东西:

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

在另一个视图控制器的另一个segue中

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 回答
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 回答