0

我的应用程序有一个主从控制器。主控制器是一个 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 会为我解决这个问题吗?我的方法可以通过吗?即使它是可以通过的,有没有更好的方法来做到这一点?

4

2 回答 2

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唯一有一个名为的属性viewControllersNSArray其中第一个对象是 masterVC,第二个是 detailVC。

查看MultipleDetailViews以了解如何管理它的示例。

由于您希望在所有详细视图控制器中都有一个标题视图,因此您有多种选择来实现它(这可能适用于您的情况,也可能不适用,具体取决于您的设计):

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

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

查看控制器基础知识

创建自定义容器视图控制器

于 2012-10-31T18:56:11.720 回答
0

不,ARC 不会为您处理这个,因为 detailViewController.view 将保留对其子视图的引用。如果不更多地了解您对这些视图所做的工作,很难说哪种方法最好。最好只显示新的视图控制器——如果你没有指向它的属性,它将在它被解除后被释放。

于 2012-10-31T18:39:23.717 回答