Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中基于策略显示视图控制器_Ios_Design Patterns - Fatal编程技术网

Ios 在swift中基于策略显示视图控制器

Ios 在swift中基于策略显示视图控制器,ios,design-patterns,Ios,Design Patterns,我的应用程序中有一些更改值的策略。例如: var canGoToPageX 当canGoToPageX的值为true时,用户可以重定向到“x”视图控制器 if canGoToPageX { present X } 该视图控制器在多个页面中显示,如果开发人员忘记编写if条件,用户将被重定向到他不允许的页面 我想做点什么来避免这个错误 有什么设计模式吗?好像canGoToPageX是全局变量,基于此,您需要限制UIViewController访问它,并且您只担心一种情况,即开发人员可能忘记

我的应用程序中有一些更改值的策略。例如:

var canGoToPageX
canGoToPageX
的值为true时,用户可以重定向到“x”视图控制器

if canGoToPageX {
   present X
}
该视图控制器在多个页面中显示,如果开发人员忘记编写if条件,用户将被重定向到他不允许的页面

我想做点什么来避免这个错误
有什么设计模式吗?

好像
canGoToPageX
是全局变量,基于此,您需要限制
UIViewController
访问它,并且您只担心一种情况,即开发人员可能忘记设置条件,那么您可以做以下几点:

override func viewWillAppear(_ animated: Bool) {
    checkIsControllerAccessible()
}

fileprivate func checkIsControllerAccessible() {
    if !canGoToPageX { //Restrictions
        let alertController = UIAlertController(title: "Error", message: "You are not allowed to access this View", preferredStyle: UIAlertController.Style.alert)
        alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: { (_) in
            self.dismiss(animated: true, completion: nil)
        }))
    }
    self.present(alertController, animated: true, completion: nil)
}
视图将出现
将始终检查它是否可访问。当您从一个
UIViewController
和限制用户访问的
UIViewController
返回时,此案例将非常有用


让我知道这是否有用

解决此问题的一种方法是创建
UIViewController
的子类,该子类覆盖
UIViewController
所具有的必要表示函数,并检查即将显示的视图控制器是否为“x”类型,以及全局
canGoToPageX
是否为真/假

这种方法需要开发人员在视图控制器上对这个新的视图控制器类进行子类化,该类可能会显示“x”,因此开发人员仍然容易忘记某些东西,但它封装了条件

以下是演示上述方法的一些示例代码:

导入UIKit
//全球国家持有者
类别单一持有人{
静态let shared=SingletonStateHolder()
var canGoToX=错误
}
//仅当“canGoToX”为true时才能显示的视图控制器
类XViewController:UIViewController{
}
//视图控制器子类,可能显示x的视图控制器可以从中创建子类
类SecureViewController:UIViewController{
覆盖函数存在(viewControllerToPresent:UIViewController,动画标志:Bool,完成:(()->Void)?=nil){
如果viewControllerToPresent为XViewController&!SingletonStateHolder.shared.canGoToX{
返回
}
super.present(viewControllerToPresent,动画:标志,完成:完成)
}
覆盖函数显示(vc:UIViewController,发送方:任何?){
如果vc是XViewController&!SingletonStateHolder.shared.canGoToX{
返回
}
super.show(vc,发件人:发件人)
}
}

canGoToPageX
是全局变量或附加到每个控制器,以及您将如何更改每个控制器的值?@sohill.Memon谢谢,canGoToPageX是一个全局变量,仅适用于x视图控制器。我想避免开发人员在不检查此策略的情况下显示此视图控制器