【问题标题】:Reusing view controllers in Swift without hacked property在 Swift 中重用视图控制器而不被黑客攻击
【发布时间】:2019-02-16 09:59:45
【问题描述】:

我一直在查看Coordinator tutorial,它提出了我过去编写的代码的问题。

也就是说,当重用视图控制器时,我使用了一个属性来显示不同的元素,具体取决于用户来自哪个视图控制器。这在上述教程中被描述为 hack。

例如,我使用 labelviewcontroller 进行选择

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "label" {
        let vc = segue.destination as! LabelViewController
        vc.originalVC = self
    }
}

然后在 labelViewController 上有一个属性

var originalVC: ViewController?

然后我通过

更改 viewDidLoad() 中的项目
override func viewDidLoad() {
    super.viewDidLoad()

    if originalVC != nil {
        label.text = "came direct"
        imageView.isHidden = true
    }
    else {
        label.text = "button"
        imageView.isHidden = false
    }
}

我在这里有一个工作示例项目:https://github.com/stevencurtis/ReusibilityIssues

现在,我知道答案可能是使用 Coordinator 教程,但是有没有其他方法可以让我在两种不同的情况下简单地重用 viewController,而不是使用属性,或者无论如何都可以清理它是可以接受的做法吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

    如果您将父类型推送到这样的导航控制器中,您可以在不传递 originalVC 的情况下执行此操作:

    if let p = parent {
            if p.isKind(of: OriginalViewController.self){
                //it pushed in navigation controller stack after OriginalViewController
            }
        }
    

    【讨论】:

      【解决方案2】:

      但是有没有其他方法可以让我在两种不同的情况下简单地重用 viewController

      如果您描述的“两种不同的情况”非常不同(我的意思是“需要运行非常不同的代码行”),那么您应该创建两个不同的视图控制器类,否则您将违反Single Responsibility Principle.

      如果您的“两种不同情况”不同,但也非常相关,那么您可以将 VC 需要知道的所有信息作为属性。你当然不需要一个完整的ViewController

      例如,如果您的LabelViewController 仅在ViewControllerFoo 提供时才会显示“foo”按钮。

      您可以在LabelViewController 中添加showFooButton 属性:

      var showFooButton = false
      
      override func viewDidLoad() {
          fooButton.isHidden = !showFooButton
      }
      

      然后在ViewControllerFoo.prepareForSegue:

      if segue.identifier == "label" {
          let vc = segue.destination as! LabelViewController
          vc.showFooButton = true
      }
      

      我不会将其称为 hack。这是this post 中描述的推荐方式,他们并没有将其称为 hack。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多