根本问题是“在不引起内存警告或触发看门狗终止的情况下,您可以将多少个UIViewControllers推送到导航堆栈上?”
假设我有一个应用程序,基本上是三个实体的数据库,每个实体都可以与其他实体建立关系,并在UIViewController上显示关系。用户可以跟随这些关系,每个关系都会带来一个新的控制器——如果实体是A、B和C,而A->B->C->B->C->A,则每种视图在堆栈上出现两次。我知道如何推送和弹出,如何返回到特定控制器,我认为最好重用导航堆栈中的视图控制器,而不是无限地扩展导航堆栈。
为了做到这一点,每当我想要一个FirstEntityViewController时,我可以扫描导航堆栈,找到一个对象,其中[self isKindOfClass:[FirstEntityViewController class]];然后调用设计用于重新调整该视图以显示我当前想要看到的内容的方法——只是刷新数据的方式,就像重用UITableViewCell时一样。
这很好,除了它可能对NavigationController产生的影响。如果我使用UINavigationController:popToViewController:animated:,我认为它将丢弃所有在我弹出的视图之上的东西,包括用户期望在导航栏中点击“返回”时找到的视图。因此,用户点击关系,然后点击返回,会感到困惑。
如果我从导航堆栈中删除匹配的控制器,然后将其弹出到堆栈顶部,那么返回行为仍然正常,只要用户没有回到被移动的FirstEntityViewController实例,否则导航将看起来不一致。
正确的解决方案是从堆栈中删除控制器,并以某种方式保留堆栈中的位置,以便当重用的控制器被弹出时,可以将其替换回原来的位置吗?我应该维护自己的视图类型和数据显示列表,以便在弹出时可以替换即将弹出的视图下面的视图,始终领先于返回导航?
还是说这太复杂了?是否根本不需要担心这种情况,因为操作系统以与UITableViewCells相同的方式重用大部分视图控制器,在具有50个深度的导航堆栈上没有真正的内存或性能影响?
假设我有一个应用程序,基本上是三个实体的数据库,每个实体都可以与其他实体建立关系,并在UIViewController上显示关系。用户可以跟随这些关系,每个关系都会带来一个新的控制器——如果实体是A、B和C,而A->B->C->B->C->A,则每种视图在堆栈上出现两次。我知道如何推送和弹出,如何返回到特定控制器,我认为最好重用导航堆栈中的视图控制器,而不是无限地扩展导航堆栈。
为了做到这一点,每当我想要一个FirstEntityViewController时,我可以扫描导航堆栈,找到一个对象,其中[self isKindOfClass:[FirstEntityViewController class]];然后调用设计用于重新调整该视图以显示我当前想要看到的内容的方法——只是刷新数据的方式,就像重用UITableViewCell时一样。
这很好,除了它可能对NavigationController产生的影响。如果我使用UINavigationController:popToViewController:animated:,我认为它将丢弃所有在我弹出的视图之上的东西,包括用户期望在导航栏中点击“返回”时找到的视图。因此,用户点击关系,然后点击返回,会感到困惑。
如果我从导航堆栈中删除匹配的控制器,然后将其弹出到堆栈顶部,那么返回行为仍然正常,只要用户没有回到被移动的FirstEntityViewController实例,否则导航将看起来不一致。
正确的解决方案是从堆栈中删除控制器,并以某种方式保留堆栈中的位置,以便当重用的控制器被弹出时,可以将其替换回原来的位置吗?我应该维护自己的视图类型和数据显示列表,以便在弹出时可以替换即将弹出的视图下面的视图,始终领先于返回导航?
还是说这太复杂了?是否根本不需要担心这种情况,因为操作系统以与UITableViewCells相同的方式重用大部分视图控制器,在具有50个深度的导航堆栈上没有真正的内存或性能影响?