我经常需要一个不会填满整个屏幕的自定义模式对话框,例如 iOS SDK 附带的操作表。这个对话框必须处理一些棘手的场景和条件,例如界面旋转,并且还经常携带大量代码来处理用户选择。因此,将对话框构建为常规 View + Controller 组合并使其像 UI 中的一等公民一样工作似乎非常可取。
系统模态 Controller API (presentModalViewController:animated:
) 在这方面非常有限,例如它坚持将 Controller 隐藏在模态 Controller 下并强制您使用预定义的动画控制它们。
Controller 包含 API 看起来很有前途,因为它允许同时在屏幕上显示多个 View ,每个 View 由不同的 Controller 管理。 (这正是常规 View Controller 顶部的模态对话框的情况。)但是与标准容器 Controller (如 UINavigationController
)的相互作用是不稳定的,as I have found out .
有没有人有可行的技术可以将非全屏模式对话框保留为常规 View Controller 并让它们与 UI 的其余部分很好地配合使用?
最佳答案
如果您绝对希望它成为一个 View Controller ,您将不得不使用 iOS 5 中引入的 containment api,听起来好像您已经在玩弄它了。我完全同意你的看法 - 它有点不稳定,因此我通常会选择不同的方法。
我创建了一个 Controller ,它是 NSObject 的子类,并将其作为一个对象添加到 interfacebuilder 中。然后我将 Controller 设置为同时具有容器和 contentView。我创建了一个将 containerView 作为参数的初始化方法,并在该方法中执行我通常在 viewWillAppear 中执行的操作。初始化方法,我从 View Controller 调用,它负责将 containerView 交给模态 Controller 。
一旦初始化,模态 Controller 就负责它的容器和内容 View 。一旦模态 Controller 应该关闭,它就会简单地将它们从它们的 super View 中删除。
这是我在 iPad 应用程序中从主视图 Controller 调用的方法。从不相关的东西中提取:)
- (IBAction)showAddProduct:(UIButton *)sender {
UIView *containterForAddProduct = self.darken;
containterForAddProduct.alpha = 0;
[self.view addSubview:containterForAddProduct];
[self.addEditProductController beginAddingProductInContainerView:containterForAddProduct andManagedObjectContext:self.gridController.managedObjectContext];
}
关于objective-c - 如何将自定义模式对话框设计为常规 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513854/