我有一个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";
}
但仍然会从两个视图执行操作。进一步的建议?
答案 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";
}