【问题标题】:How to get parent navigation controller in UIView如何在 UIView 中获取父导航控制器
【发布时间】:2011-05-09 09:49:08
【问题描述】:

我在我的应用委托中创建了一个UITabBarController。 其中每个选项卡栏项目都包含一个不同的UINavigationController,该UINavigationController 加载带有NIB 的自定义UIViewController(使用-pushViewController:)。 在其中一个导航控制器中,我还加载了一个带有自定义 NIB 的自定义 UIView 类。 此视图在UIViewController 内多次加载。

自定义UIView 有一个UIButton,在触摸它时,我想在堆栈上推送一个新的UIViewController。 问题是我“丢失”了拥有UIViewControllerUINavigationController。 我知道我应该使用委托,但还没有弄清楚谁应该哪个类应该是委托。

提前致谢!

【问题讨论】:

  • 委托会更好。委托应在您的视图类中定义,并应由您的所有者实现。其次,所有者属性应该在 UIView 中而不是在 UIViewController 中。

标签: iphone objective-c xcode ios ios4


【解决方案1】:

.navigationController 或 .tabBarController 都不适用于已创建但未推送到堆栈的 UIView 或 UIViewController

要么在你的 View(或 ViewController)类上创建一个属性,它是一个 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 是只读的,这将是明智的选择。

【讨论】:

  • 感谢您的回复。这就是我所做的,我设置了一个属性,在分配和初始化之后,我将所有者设置为“自我”。但是当在例如使用 getter [self owner] 时viewDidLoad 我得到(空)。如果我在所有者 ViewController 中执行此操作:[cvc owner] 我不会得到 (null)。
  • 您是否在将所有者添加到父子视图之前分配了所有者?
  • 是的。添加后我也释放视图。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2020-06-09
    • 2011-06-30
    • 2013-03-23
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多