我经常需要一个无法覆盖整个屏幕的自定义模式对话框,例如iOS SDK随附的操作表。该对话框必须处理一些棘手的情况和条件,例如界面旋转,并且还经常携带大量代码来处理用户的选择。因此,将对话框构建为常规的View + Controller组合并使其像UI中的一等公民一样工作似乎是非常可取的。

在这方面,系统模态控制器API(presentModalViewController:animated:)非常有限,例如,它坚持将控制器隐藏在模态控制器下,并迫使您使用预定义的动画,而对其几乎没有控制。

控制器包含API看起来很有希望,因为它允许一次在屏幕上显示多个视图,每个视图由一个不同的控制器控制。 (这恰好是在常规视图控制器顶部的模式对话框的情况。)但是,与标准容器控制器(如UINavigationController)的相互作用却很艰难,as I have found out

是否有人能将非全屏模式对话框保留为常规视图控制器,并使它们与UI的其余部分很好地配合,这是可行的吗?

最佳答案

如果您绝对希望它成为视图控制器,则必须使用iOS 5中引入的containment api,这听起来好像您已经在玩弄了。我完全同意您的意见-这有点艰难,因此我通常选择其他方法。

我创建一个子类化NSObject的控制器,并将其添加为interfacebuilder中的对象。然后,我将控制器设置为同时具有容器和contentView。我创建一个初始化方法,该方法将containerView作为参数,并执行该方法通常在viewWillAppear中执行的操作。我从视图控制器调用初始化方法,该方法负责将containerView移交给模态控制器。

初始化后,模态控制器将负责其容器视图和内容视图。模态控制器一旦退出,它将简单地将其从其超级视图中删除。

这是我从iPad应用程序的主视图控制器中调用的方法。不相关内容的摘要:)

- (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/

10-14 20:16
查看更多