如何将自定义模式对话框设计为常规视图控制器?

时间:2012-05-09 09:59:54

标签: objective-c ios cocoa-touch

我经常需要一个不会填满整个屏幕的自定义模式对话框,例如iOS SDK附带的操作表。该对话框必须处理一些棘手的场景和条件,例如界面旋转,并且还经常携带大量代码来处理用户选择。因此,似乎非常希望将对话框构建为常规视图+控制器组合,并使其像UI中的一等公民一样工作。

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

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

是否有人有一种工作技术可以将非全屏模态对话框保持为常规视图控制器并让它们与UI的其余部分很好地配合?

1 个答案:

答案 0 :(得分:0)

如果你绝对希望它是一个视图控制器,你将不得不使用在iOS 5中引入的包含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];
}