我如何优雅地从一个嵌入式视图导航到另一个(在 IB 中使用布局)?
How can I elegantly navigate from one embedded view to another (with layout in IB)?
在此应用中,用户可以执行 Activity A 或 B。执行 A 时,查看者会看到嵌入的视图 A;但在 A 期间,观众也可以选择查看嵌入的视图 B。(Activity B 也是如此,只有相反的视图。)
我在 IB 中的设置如下图所示。不知道有什么更好的方法,我创建了两倍于我想要的 activity 场景:对于 "Do Activity A" 分支,我有两个 Activity 场景的并排副本.第一个有一个到视图 A 的嵌入转场;第二个是视图 B 的嵌入转场。("B" 设置正好相反。)
为了避免更多的重复,我确实让两个 activity 分支共享视图 A 和 B。虽然 activity 场景加倍了,但 class 它们 link 到 (ActivityAViewController 和 ActivityBViewController) 不是。我还没有注意到任何并发症。 . . .
与我见过的其他解决方法相比,我选择了上面的 "push–pop" 布局,因为视图 A 和 B 很昂贵。我不想仅仅为了加载辅助视图而丢弃主视图,也不想不必要地同时加载这两个视图。另外,我想在 IB 中这样做,因为真正的应用程序更复杂,在那里看到我的所有布局有助于我理解和开发它。话虽如此,我的做法似乎还是很笨拙。
我的问题是
- 在 IB 中有更好的设置方法吗?
- activity 场景的共享视图控制器发生了什么?是为每个创建一个单独的 class 实例,还是两个场景最终共享同一个实例?
- 同样,共享视图会怎样?
Apple 的解释似乎足够清楚,尽管他们假定比我目前掌握的更多 Cocoa Touch 和相关行话知识。任何澄清和见解将不胜感激。
Is there a better way to set this up in IB?
还有其他设置方法。他们都有权衡。您的方法具有特定的外观,如果您想以不同的方式连接它,它看起来会有些不同。您的方法还有一个优点,即所有导航都由 Storyboard 处理;不需要额外的代码。
备选方案包括将视图 A 和 B 嵌入到它们自己的小导航控制器中。然后切换到查看另一个将涉及单击该 navigationController。这避免了外部 Activity A 和 B 控制器的重复,但它会通过向嵌入式视图添加导航栏来改变外观。
您也可以这样做并隐藏导航栏并从外部 Activity A 或 B 控制器传递一条消息,告诉它何时推送另一个 viewController。这有一些额外的非平凡编码的缺点; Storyboard 不再为您管理导航。
您也可以 运行 在 UITabBarController 中这样做。如果您只需要一个,那么这样做的缺点是会同时创建 Activity A 和 Activity B,但是您可以在它们之间自由切换,而无需重新创建任何视图。
What happens with the activity scenes' shared view controllers? Is a
separate class instance created for each, or do the two scenes end up
sharing the same instance?
每个转场(包括嵌入式转场)都会创建一个新的 viewController 实例。没有共享实例。
Similarly, what happens with the shared views?
每次都会创建一个新的 A 和 B 实例。
在此应用中,用户可以执行 Activity A 或 B。执行 A 时,查看者会看到嵌入的视图 A;但在 A 期间,观众也可以选择查看嵌入的视图 B。(Activity B 也是如此,只有相反的视图。)
我在 IB 中的设置如下图所示。不知道有什么更好的方法,我创建了两倍于我想要的 activity 场景:对于 "Do Activity A" 分支,我有两个 Activity 场景的并排副本.第一个有一个到视图 A 的嵌入转场;第二个是视图 B 的嵌入转场。("B" 设置正好相反。)
为了避免更多的重复,我确实让两个 activity 分支共享视图 A 和 B。虽然 activity 场景加倍了,但 class 它们 link 到 (ActivityAViewController 和 ActivityBViewController) 不是。我还没有注意到任何并发症。 . . .
与我见过的其他解决方法相比,我选择了上面的 "push–pop" 布局,因为视图 A 和 B 很昂贵。我不想仅仅为了加载辅助视图而丢弃主视图,也不想不必要地同时加载这两个视图。另外,我想在 IB 中这样做,因为真正的应用程序更复杂,在那里看到我的所有布局有助于我理解和开发它。话虽如此,我的做法似乎还是很笨拙。
我的问题是
- 在 IB 中有更好的设置方法吗?
- activity 场景的共享视图控制器发生了什么?是为每个创建一个单独的 class 实例,还是两个场景最终共享同一个实例?
- 同样,共享视图会怎样?
Apple 的解释似乎足够清楚,尽管他们假定比我目前掌握的更多 Cocoa Touch 和相关行话知识。任何澄清和见解将不胜感激。
Is there a better way to set this up in IB?
还有其他设置方法。他们都有权衡。您的方法具有特定的外观,如果您想以不同的方式连接它,它看起来会有些不同。您的方法还有一个优点,即所有导航都由 Storyboard 处理;不需要额外的代码。
备选方案包括将视图 A 和 B 嵌入到它们自己的小导航控制器中。然后切换到查看另一个将涉及单击该 navigationController。这避免了外部 Activity A 和 B 控制器的重复,但它会通过向嵌入式视图添加导航栏来改变外观。
您也可以这样做并隐藏导航栏并从外部 Activity A 或 B 控制器传递一条消息,告诉它何时推送另一个 viewController。这有一些额外的非平凡编码的缺点; Storyboard 不再为您管理导航。
您也可以 运行 在 UITabBarController 中这样做。如果您只需要一个,那么这样做的缺点是会同时创建 Activity A 和 Activity B,但是您可以在它们之间自由切换,而无需重新创建任何视图。
What happens with the activity scenes' shared view controllers? Is a separate class instance created for each, or do the two scenes end up sharing the same instance?
每个转场(包括嵌入式转场)都会创建一个新的 viewController 实例。没有共享实例。
Similarly, what happens with the shared views?
每次都会创建一个新的 A 和 B 实例。