防止 UISplitViewController 在详细视图中单击时关闭主选项卡?

Prevent UISplitViewController from closing the primary tab on a click in the detail view?

UISplitViewController 用于显示模式为 PrimaryOverlay 的 iPad 应用,在两个视图中 UITableViewControllers 嵌入 UINavigationControllers

当主要 viewController 正在重新加载内容并显示 UIRefreshControl 时,我想防止在主要视图之外的点击导致主要关闭。我四处寻找一些 UIGestureRecognizer 可能会拦截水龙头,但在任何看似相关的视图中都找不到。我似乎也无法通过在两个拆分窗格中的任何一个上添加我自己的屏幕大小的视图来阻止这种情况,或者即使添加为 splitView 本身的子视图也是如此。

拆分视图控制器确实在主表视图中安装了两个手势识别器,可能与滑动手势有关,一个是点击识别器,一个是滑动识别器。但是禁用两者(通过将它们的 enabled 属性 设置为 false)对行为没有影响,就像完全删除它们一样。

也没有明显的委托方法可用于停止关闭。在这一点上,我完全不知道可以做些什么来获得我想要的行为。

我只能使用以下代码阻止主视图控制器关闭:

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            window?.userInteractionEnabled = false

            return true
    }
}

但这显然还有其他不好的副作用(用户根本无法与您的应用进行交互)。

也许更好的解决方案是允许用户关闭主视图控制器,并让您的主视图控制器适当地处理它。这似乎是 Apple 打算在此显示模式中使用 UISplitViewController 的方式。

在刷新时保持主视图控制器打开的动机是什么?

我确实在这里找到了一个解决方法 - 一种防止窗格在一些较长的 运行 任务正在进行时关闭的方法 - 但虽然不优雅,但它似乎可行。

解决方法:弹出警报,并添加可用于显示 activity 进度的文本字段(我知道,哎呀!)

我刚刚验证了警报块触及视图边界之外。因此,您创建一个警报,添加一两个文本字段,并在显示警报之前获取其中的引用。

随着您的刷新控件旋转(或者您可能先将其关闭),您会定期更新其中一个包含进度信息的文本字段(我尚未验证此功能是否有效,当我发现时会更新答案)。

如果您希望它看起来比纯文本更好看,请使用带有图像的 NSAttributed 字符串。形象可以进步一下吧!但是,更新它可能会导致屏幕闪烁(同样,还没有这样做)。

或者,Alert只是显示一个Cancel按钮,用户可以通过后台看到一些进度信息。

是的,真正的骇客。如果后台的进度控制是可见的,那么替代解决方案也许并没有那么糟糕。请注意,刷新控件接受属性文本,因此可以使用它实现进度指示器。