Swift: шаблон для ViewController, доступ к которому можно получить из разных мест - PullRequest
0 голосов
/ 22 октября 2018

В моем приложении есть экран «Подробности» / VC, доступ к которому можно получить с 3 разных экранов.

В настоящее время я использую инжекцию зависимости конструктора и 3 различных инициализатора для установки правильных переменных в зависимости от того, откуда приходит пользователь.

Тем не менее, большая часть логики находится в ViewDidLoad под довольно уродливыми ifs

Написал небольшой пример, чтобы дать вам представление о том, как он выглядит сейчас:

if object != nil {

    WebApi.fetchDropDown1 { items in
        dropdown.selectedItem = items.first{$0.id == object.UnitId}
    }

    currentDateLabel = object.date
} else if object == nil && currentDate == nil {
    // came to add from list of objects

    // object doesn't exist yet

    WebApi.fetchDropDown1 { items in
        dropdown.selectedItem = items[0] // select first availabile
    }

    currentDateLabel = Date() // set today as default date
    deleteButton.isEnabled = false
    // something like that for every element

} else if { currentDate != nil && object == nil} {
    // came here from calendar pick

    WebApi.fetchDropDown1 { items in
        dropdown.selectedItem = items[0] // select first availabile
    }

    currentDateLabel = currentDate

}

Это не настоящий код, а просто пояснение того, что я пытаюсь решить.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

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

0 голосов
/ 22 октября 2018

Я бы предложил использовать enum для этого варианта использования.

Вы можете объявить публичное перечисление вне ViewController следующим образом:

public enum InitialiserType {
    case typeOne
    case typeTwo
    case defaultType
}

Создать свойство в вашем ViewController какthis:

initialiserType:InitialiserType = .defaultType

Установка его по умолчанию вызовет инициализатор по умолчанию, если тип не указан.

Кроме того, добавьте следующий код в viewDidLoad():

switch self.initialiserType {
    case .typeOne:
        print("Do the custom code for type one here")
    case .typeTwo:
        print("Do the custom code for type two here")
    case .defaultType:
        print("Do the default code here")
}

Теперь, когда вы инициализируете Viewcontroller, просто установите этот тип:

controller.initialiserType = .typeOne

В зависимости от типа, который вы здесь установите, инициализатор будет работать соответственно.

...