iOS中主/详细视图中的子视图管理(使用ARC)

时间:2012-10-31 18:20:46

标签: ios uiview master-detail

我的应用程序有一个主 - 细节控制器。主控制器是一个UITabBarController,每个选项卡都是一个包含不同类型数据的UITableViewController。

我计划在主要详细视图上设置主标题/图像,但是需要在主要详细视图中添加不同的子视图,以根据我使用的标签详细说明具体信息。

我目前正在我的

中添加相关的子视图

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

功能如下:

UIViewController *subview = [[UIViewController alloc] initWithNibName:@"ItemNotFoundViewController" bundle:nil];
subview.view.frame = CGRectMake(20, 160, subview.view.frame.size.width, subview.view.frame.size.height);  
[self.detailViewController.view addSubview:subview.view];

但是,我认为这是一种糟糕的做事方式 - 每当有人点击表格单元格时,另一个子视图将被抛到先前添加的子视图堆栈之上,从而产生内存问题。

我想知道的是,ARC是否为我照顾这个?我的方法是否可以接受?即使它可以通过,还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

首先,没有。 ARC不会为您解决此问题。这样做的目的不是它,即使它是,它怎么可能知道,你不再需要以前添加的子视图了? 您必须自己删除这些子视图,然后然后 ARC将负责取消分配它们(如果没有其他参考)。

无论如何,这不是你应该使用UISplitViewController(主 - 细节视图控制器)的方式。您注意到拆分视图控制器处理另外两个视图控制器。 master-和detailViewController。在大多数情况下,主视图控制器在应用程序运行时不会更改(它的内容更改,但通常由容器视图控制器(如UINavigationController处理,它被指定为masterViewController),但详细视图控制器会这样做。

不应将子视图添加到现有的detailViewController中,而应该用新的替换它。因此,您应该为要在详细信息部分中显示的所有视图控制器创建单独的XIB(您已经显示已经完成的操作)。并修改您的代码

self.detailViewController = newDetailViewController; //newDetailViewController would be the vc you called subview in your code

而不是

[self.detailViewController.view addSubview:subview.view];

编辑:请注意,这假设您的detailViewController属性在设置值时会执行“正确的操作”。默认情况下,UISplitViewController只有一个名为viewControllers的属性,它是NSArray,其中第一个对象是masterVC,第二个是detailVC。

请查看MultipleDetailViews,了解如何管理它。

由于您希望在所有详细视图控制器中都有一个标题视图,因此您可以选择多种方式(根据您的设计,这可能适用于您的情况,也可能不适用):

  • 将标题视图添加到每个详细信息vc的XIB
  • 而不是为所有detail VC创建许多XIB,创建一个新的自定义UIViewController子类,根据您提供的一些参数修改它的内容,即用户点击哪个tableViewCell
  • 创建一个自定义容器视图控制器,用于管理两个子视图控制器,一个用于标题,另一个用于上面的内容。

有关UISplitViewController和自定义容器视图控制器的更多信息,请参阅:

View Controller Basics

Creating Custom Container View Controllers

答案 1 :(得分:0)

不,ARC不会为您服用,因为detailViewController.view将保留对其子视图的引用。如果不了解更多关于你对这些观点的看法,很难说哪种方法最好。最好只呈现新的视图控制器 - 如果你没有指向它的属性,它将在被解除后被解除分配。