访问子视图在当前视图

问题描述:

我创建通过下面的代码子视图的视图,我AppDelegate.m文件访问子视图在当前视图

//in AppDelegate.m file 
//Initializeing the navcon, photoviewtable and default loading page 
self.navcon = [[UINavigationController alloc]init]; 
self.photoViewTable = [[PhotoTableViewController alloc]init]; 
self.loadingPage = [[LoadingPageViewController alloc]init]; 

[self.photoViewTable.view addSubview:loadingPage.view]; 

[navcon pushViewController:photoViewTable animated:NO]; 
[self.window addSubview:navcon.view]; 

我如何进入子视图LoadingPage.view当我在PhotoTableViewController.view

你试图在同一时间使用两个视图控制器:

self.photoViewTable = [[PhotoTableViewController alloc]init]; 
self.loadingPage = [[LoadingPageViewController alloc]init]; 

[self.photoViewTable.view addSubview:loadingPage.view]; 

如果LoadingPageViewController是一个UIViewController子类,上面的代码不正确。除了像UINavigationViewController这样的“容器”视图控制器,在给定的时间内应该只有一个视图控制器处于活动状态。请参阅this SO thread中的my answer以获得更全面的情况介绍。简而言之,UIViewController是为了管理整个屏幕的内容,而且你从UIViewController获得的大部分功能都涉及到管理这些屏幕。

但是,为了更直接地回答您的问题,我们可以忽略多个UIViewController问题,并查看每个对象的责任。既然你已经创建了一个对象(loadingPage)来管理一些视图,那么photoViewTable应该真的让LoadPage完成它的工作并避免直接操作loadPage的视图。为PhotoTableViewController指定一个指向LoadingPageViewController的指针,以便photoViewTable可以将消息发送到loadingPage。

+0

感谢您的回复和建议。实际上,我打算在这里做的只是隐藏/取消隐藏显示中的loadingPage视图。因此,例如,如果某个动作被触发,我想要执行类似“loadingPage.view.hidden = NO”的操作来显示加载页面,否则将其隐藏。这个可以吗?或者你有其他建议吗? – Zhen 2011-06-04 12:30:12

+0

我只是摆脱loadPage并给PhotoTableViewController一个加载视图,它可以管理自己。它似乎已经做了几乎这样,因为它显然知道它何时加载以及何时不加载。但是,如果你不想这样做,给它一个指向loadPage对象的指针,并告诉loadPage它已经开始或停止加载。该对象可以管理这些视图。真的,尽你所能,但如果你要使用控制器对象的麻烦,你应该让它控制它的视图。否则,它是为了什么? – Caleb 2011-06-04 13:40:16

+0

你能告诉我我该怎么做吗?我试图添加创建一个UIView *子视图并将其添加到phototableviewcontroller.view,但子视图似乎不显示。无论如何,这是你建议的方法吗? – Zhen 2011-06-04 14:34:09

使用tag财产UIView让您的loadingPage.viewPhotoTableViewController

loadingPage.view.tag = 111; 
[self.photoViewTable.view addSubview:loadingPage.view]; 

在您的photoViewTable类中。

LoadingPageViewController* myLoadingPage = (LoadingPageViewController*) [self.view viewWithTag:111]; 

除非通过引用或标记标记它,否则应该可以像这样得到它。

for (UIView *subview in self.view.subviews) { 
    if ([[subview nextResponder] isMemberOfClass:[LoadingPageViewController class]]) { 
     // 'subview' is your view 
    } 
}