【问题标题】:How to design custom modal dialogs as regular view controllers?如何将自定义模式对话框设计为常规视图控制器?
【发布时间】:2023-03-13 17:37:01
【问题描述】:

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

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

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

有没有人有一种可行的技术可以将非全屏模式对话框保留为常规视图控制器,并让它们与 UI 的其余部分很好地配合?

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    如果你绝对希望它成为一个视图控制器,你将不得不使用 iOS 5 中引入的容器 api,这听起来好像你已经在玩弄了。我完全同意你的看法——这有点棘手,因此我通常会选择不同的方法。

    我创建了一个子类 NSObject 的控制器,并将其作为对象添加到 interfacebuilder 中。然后我将控制器设置为同时具有容器和内容视图。我创建了一个将 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];
    }
    

    【讨论】:

    • 缺点是这样的控制器不是控制器层次结构的一部分,因此不接收旋转和外观调用?这就是我要避免的,我希望模态对话框成为 UI 的常规部分,就像使用 presentModalViewController:animated: 呈现时一样。
    • Zould,如果你想让它和它的父视图控制器一起旋转,它会自动旋转没有问题。但是,如果您确实希望它的行为方式与其父视图控制器不同,则您必须自己实现 willRotate 方法并从父视图控制器委托方法中调用它。
    • 就是这样,我希望能够完全交换视图的内容,并且通常可以在常规视图控制器中做任何疯狂的事情。从父视图控制器手动传递所有信息和回调很糟糕——这就是我试图提出一些“系统”解决方案的原因。如果不是因为 UINavigationController 的问题,容器 API 非常接近。
    • 如果你看看你必须转发的方法的数量,真的没有那么多:) 但我理解你的担心,在我选择去之前我一直在拼命寻找类似的解决方案使用上述方法。我只是发现它是最干净的,如果你发现了什么,请告诉我。
    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多