Повторное использование контроллеров представления в Swift без взломанного свойства - PullRequest
0 голосов
/ 16 февраля 2019

Я просматривал учебник по Coordinator , и в нем возникла проблема с кодом, который я написал в прошлом.

А именно, при повторном использовании контроллера представления я использовал свойство, чтобы иметь возможность отображать различные элементы в зависимости от того, с какого контроллера представления пришел пользователь.Это описывается в приведенном выше руководстве как хак.

Например, я обращаюсь к 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 для двух разных обстоятельств, вместо использования свойства, или есть какой-либо способ исправить это, чтобы это стало приемлемой практикой?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

но есть ли какой-либо другой метод, который я могу использовать для простого повторного использования viewController для двух разных обстоятельств

Если описанные вами «два разных обстоятельства» очень разные (этим яозначает «требуют очень разные строки кода для запуска»), то вам следует создать два разных класса контроллера представления, потому что в противном случае вы нарушили бы принцип единой ответственности .

Если ваш »два разных обстоятельства "разные, но также довольно взаимосвязанные, тогда вы можете просто иметь всю информацию, которую VC должен знать как свойства.Вам, конечно, не нужен целый ViewController.

Например, если ваш LabelViewController будет показывать кнопку "foo", только если она представлена ​​ViewControllerFoo.

Youможно добавить свойство showFooButton в LabelViewController:

var showFooButton = false

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

А затем в ViewControllerFoo.prepareForSegue:

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

Я бы не назвал это хаком.Это возобновленный способ, описанный в этом посте , и они не назвали это хаком.

0 голосов
/ 16 февраля 2019

Вы можете сделать это, не передавая originalVC, просто проверив родительский тип, если вы помещаете его внутрь контроллера навигации, например:

if let p = parent {
        if p.isKind(of: OriginalViewController.self){
            //it pushed in navigation controller stack after OriginalViewController
        }
    }
0 голосов
/ 16 февраля 2019

Мне еще предстоит попробовать шаблон координатора, поэтому я не могу это прокомментировать.Если вы ищете другой способ, я думаю, что использование UserDefaults могло бы быть лучшим решением.

Так, например, допустим, что вы выполняете переход к labelViewController после нажатия кнопки:

 @IBAction func buttonPressed(_ sender: Any) {
    userDefaults.set(true, forKey: "seguedHere")
    performSegue(withIdentifier: "segueToLabelVC", sender: self)
}

И затем в labelViewController:

override func viewDidLoad() {
super.viewDidLoad()

if userDefaults.bool(forKey: "seguedHere") == false {
    label.text = "came direct"
    imageView.isHidden = true
}
else {
    label.text = "button"
    imageView.isHidden = false
 }
}

Таким образом, мы сохраняем логическое значение не в одном из контроллеров представления, а в пользовательских настройках по умолчанию и делаем вещи более простыми.

На мой взгляд, это более чистое решение, но у других вполне могут быть лучшие предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...