在当前视图中访问子视图

时间:2011-06-04 08:25:33

标签: objective-c cocoa-touch ios uiviewcontroller subview

我通过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

3 个答案:

答案 0 :(得分:5)

使用tag的{​​{1}}属性将UIView放入loadingPage.view

PhotoTableViewController

loadingPage.view.tag = 111; [self.photoViewTable.view addSubview:loadingPage.view]; 课程中。

photoViewTable

答案 1 :(得分:4)

除非您通过引用或标记进行标记,否则您应该能够这样做。

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

答案 2 :(得分:3)

您尝试同时使用两个视图控制器:

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

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

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

要更直接地回答您的问题,让我们忽略多个UIViewController问题,只看每个对象的责任。由于您已经创建了一个对象(loadingPage)来管理一组视图,因此photoViewTable应该让loadingPage完成它的工作并避免尝试直接操作loadingPage的视图。为PhotoTableViewController提供一个指向LoadingPageViewController的指针,以便photoViewTable可以向loadingPage发送消息。