Iphone 在具有多个UINavigationController的UIDABBARController中,获取推送到UINavigationController堆栈上的视图控制器的父级

Iphone 在具有多个UINavigationController的UIDABBARController中,获取推送到UINavigationController堆栈上的视图控制器的父级,iphone,objective-c,ios,foundation,Iphone,Objective C,Ios,Foundation,所以这里有一个问题我真的有麻烦。我使用此代码检索推送到UINavigationController堆栈的UIViewController的父控制器: MyAppDelegate *delegate = [[UIApplicationDelegate sharedApplication] delegate]; UINavigationController *nav = delegate.navigationController; MyParentViewController *parent = (

所以这里有一个问题我真的有麻烦。我使用此代码检索推送到UINavigationController堆栈的UIViewController的父控制器:

MyAppDelegate *delegate = [[UIApplicationDelegate sharedApplication] delegate];
UINavigationController *nav = delegate.navigationController;
MyParentViewController *parent = (MyParentViewController *)nav.topViewController;
parent.myProperty = @"propertyValue";
但是,这似乎仅在使用带有单个导航控制器的应用程序时才起作用。我的结构是:

->UITabBarController
-->UINavigationController
--->MyYetAnotherParentViewController
-->UINavigationController
--->MyOtherParentViewController
-->UINavigationController
--->MyParentViewController
这意味着在选项卡栏控制器中有3个导航控制器

我目前在第三个导航控制器中,已将视图控制器推到MyParentViewController上方


我正在尝试使用属性将数据从推送到MyParentViewController的UIViewController传递。如果我有此设置,我将如何检索推到堆栈中的UIViewController的父级?

不确定这是否是您要查找的,但我认为它是[nav ViewController]阵列中最顶级的ViewController。

不确定这是否是您要查找的,但我认为它是中最顶级的ViewController[nav viewControllers]数组。

即使您能够使用此方法实现此目标,但这与MVC设计模式不符。理想情况下,您的子VC应该调用模型类(可能是单例)的方法&模型类应该通知您的父VC。您可以执行以下操作-

//In your child VC 
[[MyModelClass sharedInstance] buttonClickedInChildVC:@"propertyValue"];

//In your Model class
[[NSNotificationCenter defaultCenter] postNotificationName:@"buttonClickedInChildVC" object:@"propertyValue"];

//In your Parent VC
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(buttonClickedInChildVC:) 
                                                 name:@"buttonClickedInChildVC"
                                               object:nil];

-(void)buttonClickedInChildVC:(NSNotification *) notification
{
    //do something
}

即使您能够使用此方法实现这一点,但这与MVC设计模式并不一致。理想情况下,您的子VC应该调用模型类(可能是单例)的方法&模型类应该通知您的父VC。您可以执行以下操作-

//In your child VC 
[[MyModelClass sharedInstance] buttonClickedInChildVC:@"propertyValue"];

//In your Model class
[[NSNotificationCenter defaultCenter] postNotificationName:@"buttonClickedInChildVC" object:@"propertyValue"];

//In your Parent VC
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(buttonClickedInChildVC:) 
                                                 name:@"buttonClickedInChildVC"
                                               object:nil];

-(void)buttonClickedInChildVC:(NSNotification *) notification
{
    //do something
}