代码之家  ›  专栏  ›  技术社区  ›  rob5408

访问父视图控制器(自定义)属性

  •  12
  • rob5408  · 技术社区  · 15 年前

    我写了一篇 UITabBarController 子类(调用 MainViewController )并添加了一些实例变量,特别是一个类型为venue的场所。每个选项卡 主视图控制器 需要访问 主视图控制器 . 在第一个选项卡中,a UIViewController 子类命名 HomeViewController 我写了我的 viewDidLoad 方法,并尝试用这两种方法输出到nslog…

    NSLog(@"%@", self.parentViewController.venue.name);
    

    NSLog(@"%@", self.tabBarController.venue.name);
    

    但是xcode给出了错误

    error: request for member 'venue' in something not a structure or union
    

    我可以从内部进入场地 主视图控制器 很好,所以排除了一个错误。iPhone模拟器可以看到 self.parentViewController self.tabBarController 作为 主视图控制器 . 线…

    NSLog(@"%@", self.tabBarController);
    

    输出…

    2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600>
    

    因为它被视为 主视图控制器 例如,我怀疑使用演员阵容会有所帮助。是初始化 家庭视图控制器 或者我只是在做一些完全错误的事情 self.parentViewController.venue.name “?谢谢,Rob

    3 回复  |  直到 9 年前
        1
  •  27
  •   Ed Marty    15 年前

    你做错了什么。 parentViewController 声明为 UIViewController . NSLog 由于多态性的奇迹,它输出了真正的类型。

    ui视图控制器 没有一个 Venue 成员。你的 MainViewController 做。事实上,这是正确的答案。确保导入 MainViewController.h 也。

    #import "MainViewController.h"
    [...]
    NSString *name = ((MainViewController *)self.parentViewController)).venue.name;
    

    当然,还要确保 venue 声明为 @property 主视图控制器,以及 name 是一个 @房产 属于 地点 .

        2
  •  4
  •   Tim Kozak    13 年前
    int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
    
    //previous view controller
    AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];
    
    account.property = object;
    [account doSmthng];
    
        3
  •  1
  •   Ravi Gautam    9 年前

    你的 NSLog() 声明将其“视为” MainViewController 因为这就是物体的实际情况。但是,您遇到的问题是编译器实际上没有意识到这一点,因为 parentViewController 属性声明为普通旧属性 UIViewController . 即使您实际上返回了它的子类,就编译器所知,您正试图在 ui视图控制器 会抱怨的。把它铸造成 主视图控制器 会解决这个问题。