如何在UIView中获取父级导航控制器

3
我已经在我的应用程序委托中创建了一个UITabBarController,在其中每个选项卡都包含不同的UINavigationController,使用-pushViewController:加载带有NIB的自定义UIViewController。 在导航控制器的其中之一中,我还加载了一个带有自定义NIB的自定义UIView类。该视图在UIViewController内部多次加载。
自定义UIView具有UIButton,当点击它时,我想在堆栈上推送一个新的UIViewController。问题是我“丢失”了持有UIViewController的UINavigationController。 我知道我应该使用代理,但尚未确定哪个类应该是代理。
提前致谢!

委托可能更好。委托应该在您的视图类中定义,并由您的所有者实现。其次,所有者属性应该在UIView而不是UIViewController中。 - Abid Hussain
2个回答

3

未被推到堆栈上的UIView或UIViewController将无法使用.navigationController或.tabBarController

您可以在视图(或视图控制器)类中创建一个属性,该属性是提供初始化后可选的UIViewController,或者您可以在initWithNibName:bundle:中添加第三个参数。

@interface CustomViewController : UIViewController
{ 
    UIViewController *owner;
}

@property (nonatomic, assign) UIViewController* owner;

@end

然后在拥有者 ViewController 中:

CustomViewController *cvc = [[CustomViewController alloc] initWithNibNamed:nil bundle:nil];
cvc.owner = self;

很遗憾,.parentViewController是只读的,这本应该是这个功能的合理位置。


谢谢您的回复。 这就是我所做的,我设置了一个属性,在分配和初始化后,我将所有者设置为“self”。 但是当我在例如viewDidLoad中使用getter [self owner]时,我得到(null)。 如果我在所有者ViewController中执行它:[cvc owner],我就不会得到(null)。 - omeraloni
你是否在将它添加到父子视图之前分配所有者? - Cameron Hotchkies
是的,我在添加视图后也释放它。 - omeraloni

0

您可以使用UIApplication类来获取此信息。使用此类,您可以找到首个放置的viewController。这里是link的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接