告诉ViewController推送了DetailViewController

时间:2012-08-12 21:50:21

标签: iphone objective-c ios

我有一个DetailViewController,当选择Cell时,它会从RootViewController1或RootViewController2通过storyboard segue推送/输入。

DetailViewController有一个带IBAction的按钮。我可以将动作编程为:

如果父ViewController是RootViewController2,则返回。否则,执行Action。 像这样:

-(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";
}

但仍然会从两个视图执行操作。进一步的建议?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 .... block中将其设置为它。像这样:

 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数组。

希望有所帮助。

答案 2 :(得分: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";
}