我已经实现了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。
答案 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*)
一个类无法导入自己。