有没有办法让控制器只能在 iOS 中显示(也许在 macOS 中也是如此)?

Posted

技术标签:

【中文标题】有没有办法让控制器只能在 iOS 中显示(也许在 macOS 中也是如此)?【英文标题】:Is there any way to make a controller only presentable in iOS (maybe in macOS too)? 【发布时间】:2017-12-17 10:46:28 【问题描述】:

编辑:接受的答案正在满足我的需求,但我仍然对不同的方法持开放态度。

我想出了这个问题。我有一个控制器,我希望它只是可展示的。如果某些控制器尝试推送它或尝试使用其他 segue 显示它,则应用程序不应显示它。让我用一个例子来澄清一下:

class OnlyPresentableController : UIViewController

    ///imagine a variable like this exists.
    override var isOnlyPresentable : Bool
        return true
    
    //........



class SomeController : UIViewController

    //.....

    @IBAction func aButtonClick(_ sender: UIButton) 

        let controller = OnlyPresentableController(nibName: "OnlyPresentableController", bundle: Bundle.main)

       //this will work
       present(controller, animated: true, completion: nil)
    
    @IBAction func anOtherButtonClick(_ sender: UIButton) 

        let controller = OnlyPresentableController(nibName: "OnlyPresentableController", bundle: Bundle.main)

        //this will not work because controller is an only presentable one.
       navigationController?.pushViewController(controller, animated: true)
    


那你怎么看?这可以实现吗?

【问题讨论】:

【参考方案1】:

所以我有一个关于防止推送的想法。你可以使用 Swizzling 来调配pushViewController 函数。因此,在 swizzles 函数中,您检查视图控制器是否是 OnlyPresentableController 的实例,然后您什么也不做,如果不是,您可以继续推送。

注意:我假设您了解 Method Swizzling

【讨论】:

嗯...这可以满足我的需求。但是我在这种情况下的特定代码将成为框架的一部分。在每个项目的每个代码的每种情况下使用 swizzling 是否安全? Swizzling 特别危险,如果没有人在您的项目中意识到它们,不幸的是,有些问题如果不使用 swizzling 就无法解决。如果它是框架的一部分应该没问题。

以上是关于有没有办法让控制器只能在 iOS 中显示(也许在 macOS 中也是如此)?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法强制显示工具提示?

在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

iOS 在 iPad 详细拆分视图中更改 iAD 横幅大小

在 iOS 7 中让导航栏与状态栏重叠

iOS中的显示动画(属性动画)

让导航栏与iOS 7中的状态栏重叠