无法访问self.parentViewController.property

时间:2014-03-27 21:22:01

标签: ios objective-c uiviewcontroller

我已经实现了ECSlidingViewController的子类。

InitialViewController.h
@interface InitialViewController : ECSlidingViewController

@property (nonatomic, strong) WebViewController *webVC;
@property (nonatomic, strong) MenuViewController *menuVC;

@end

我需要从.menuVC访问.webVC,但我无法从self.parentViewController.webVC访问它们获取错误:

 "UIViewController does not have a member named webVC"

但是当我签入调试器时

po self: <MenuViewController>
po self.parentViewController: <InitialViewController>
po self.parentViewController.webVC: error: property 'webVC' not found on object of type 'UIViewController *'

但是,当我在局部变量窗口中导航self的对象树时,我可以去

-self <MenuViewController> 0x0000001
  -UITableViewController
    -UIViewController
      -_parentViewController <InitialViewController>
        -webVC <WebViewController
        -menuVC <MenuViewController> 0x0000001

其中self和self.parentViewController.menuVC具有相同的内存地址

当我向下导航并右键单击 - >打印描述时,我得到了

    Printing description of self->_parentViewController->menuVC:
<MenuViewController: 0x8e8c720>

那些' - &gt;'并且'_'让我觉得我严重缺少涉及指针和ivars的东西。

如果有更好的方法来实现此功能,我也很感兴趣。这种气味就像我正在打破MVC,孩子控制器知道自己和它的父母。但是,菜单上的选择直接操作我加载的webView。

1 个答案:

答案 0 :(得分:3)

答案:

UIViewController没有内置此属性,因此您需要强制转换它:

[(InitialViewController*)self.parentViewController webVC]

说明:

这是一个Classes和SubClasses的问题。假设我有一个类MyView,它是UIView的子类。这个类有几个方法,-(void)method1;-(void)method2;。 .h看起来像这样:

@interface MyView : UIView

- (void)method1;
- (void)method2;

@end

然后我创建一个名为MyView*的{​​{1}}并将其分配给我的ViewController的view属性:

thisView

UIViewController类的属性#import "MyView.h" - (void)viewDidLoad { MyView* thisView = [[MyView alloc] init]; [self setView: thisView]; } 声明如下:

view

特别注意那里的@property (...) UIView* view;

因为UIView*被声明为UIView *,它将接受作为UIView *的子类的值,但是当我稍后访问它时,它会在标有view的框中给我一个MyView。

换句话说,请考虑以下代码:

UIView

UIViewController将返回- (void)viewDidLoad { MyView* thisView = [[MyView alloc] init]; [self setView: thisView]; UIView* returnedView = thisView; //This is perfectly fine } 行内的某些内容,即returnedView容器中的MyView

当你的程序访问视图时,它所知道的只是在标有&#34; UIView&#34;的框中收到了一些东西,所以它只知道它可以在它上面运行UIView中存在的方法类。我们必须明确告诉它&#34;不,这是一个MyView,&#34;我们用铸造来做到这一点:

UIView

回到你的问题

当您访问[self.view method1]; //This will break [(MyView*)self.view method1]; //This will work 时,您将在UIViewController框中获得一个InitialViewController,因此您必须明确告诉您的程序它是一个InitialViewController。你通过施放来做到这一点:

self.parentViewController

警告:

您访问webVC的VC必须声明InitialViewController* parentVC = (InitialViewController*)self.parentViewController; [parentVC.webVC doSomething]; ,因此您需要注意前向声明错误。

如果您对此不熟悉,那么当A类进口B类时,B类也会进口A类:

(InitialViewController*)

一个类无法导入自己。