在当前视图中访问子视图
在当前视图中访问子视图
我在AppDelegate.m文件中使用以下代码创建了一个带有子视图的视图:
//在AppDelegate.m文件中
//初始化导航控制器,照片视图表和默认加载页面
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];
当我在PhotoTableViewController.view中时,如何访问子视图LoadingPage.view?
问题出现的原因是在PhotoTableViewController
中无法访问到loadingPage.view
。解决方法是使用UIView
的tag
属性来获取loadingPage.view
。
首先,在PhotoTableViewController
中将loadingPage.view
的tag
属性设置为111,并将其添加到self.photoViewTable.view
中:
loadingPage.view.tag = 111; [self.photoViewTable.view addSubview:loadingPage.view];
然后,在photoViewTable
类中,使用viewWithTag:
方法来获取带有tag为111的视图myLoadingPage
:
LoadingPageViewController* myLoadingPage = (LoadingPageViewController*) [self.view viewWithTag:111];
问题的原因是尝试同时使用两个视图控制器。根据UIViewController的设计原则,除了像UINavigationViewController这样的“容器”视图控制器之外,同一时间只能有一个活动的视图控制器。因此,如果LoadingPageViewController是一个UIViewController的子类,上述代码是不正确的。
解决方法是让PhotoTableViewController委托LoadingPageViewController来管理它的视图,而不是直接操作loadingPage的视图。可以给PhotoTableViewController添加一个指向LoadingPageViewController的指针,这样photoViewTable就可以向loadingPage发送消息了。
另一种解决方法是去掉loadingPage,让PhotoTableViewController自己管理一个loading视图。根据你之前提到的PhotoTableViewController已经知道何时正在加载和何时不加载的情况,似乎它已经在做类似的工作了。但如果你不想这样做,可以给它一个指向loadingPage对象的指针,并告诉loadingPage何时开始或停止加载。这样loadingPage对象就可以管理视图了。无论如何,根据你的需求来决定采取哪种方法,但如果你使用控制器对象,应该让它控制它的视图,否则控制器的作用是什么呢?
你问我如何实现这样的方法,我尝试创建一个UIView *subview并将其添加到phototableviewcontroller.view,但是子视图似乎没有显示出来。不过,这是你所建议的方法吗?
问题出现的原因是没有明确标记或者使用标签,导致无法直接访问当前视图中的子视图。解决方法是使用循环遍历当前视图的所有子视图,然后通过判断子视图的nextResponder是否为指定的类来获取目标子视图。
具体的解决方法如下所示:
for (UIView *subview in self.view.subviews) { if ([[subview nextResponder] isMemberOfClass:[LoadingPageViewController class]]) { // 'subview' is your view } }
以上代码中,首先通过for循环遍历当前视图(self.view)的所有子视图(subview),然后通过判断子视图的nextResponder是否为指定的类(LoadingPageViewController class)来确定目标子视图。如果判断成功,则可以通过'subview'来访问目标子视图。
这样,就解决了在当前视图中访问子视图的问题。