我的应用程序有一个主 - 细节控制器。主控制器是一个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是否为我照顾这个?我的方法是否可以接受?即使它可以通过,还有更好的方法吗?
答案 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,了解如何管理它。
由于您希望在所有详细视图控制器中都有一个标题视图,因此您可以选择多种方式(根据您的设计,这可能适用于您的情况,也可能不适用):
UIViewController
子类,根据您提供的一些参数修改它的内容,即用户点击哪个tableViewCell 有关UISplitViewController
和自定义容器视图控制器的更多信息,请参阅:
答案 1 :(得分:0)
不,ARC不会为您服用,因为detailViewController.view将保留对其子视图的引用。如果不了解更多关于你对这些观点的看法,很难说哪种方法最好。最好只呈现新的视图控制器 - 如果你没有指向它的属性,它将在被解除后被解除分配。