Как динамически переключать тему пользовательского интерфейса на основе разных типов пользователей в iOS

В моем приложении есть сценарий, в котором мне нужно переключить дизайн темы пользовательского интерфейса в зависимости от типа пользователя. Например: в моем пользовательском потоке Type1 он выглядит как Registration Screen -> HomePage Screen, а в моем пользовательском Type 2 он должен выглядеть как Registration Screen-> Contact Screen -> Home Page Screen. И дизайн пользовательского интерфейса и темы отличаются в случае пользователя типа 2. Для этого ниже приведен пример потока кода, который реализован в настоящее время.

RegistrationViewController

(Этот вид доступен для обоих пользователей, но тема пользовательского интерфейса отличается, например, цвет панели навигации, цвет bg, цвет кнопок, шрифты, изображения и т. Д.)

override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }


private func setupViews(){

        if Utilities.isUserType1{
            setupViewsForType1User() //Adds themes for type 1 user
        } else {
            setupViewsForType2User() //Adds themes for type 2 user
    }

}

 @IBAction func continueAction(_ sender: Any) {

    if Utilities.isUserType1{
            goToContactView() //Goes to ContactViewController
        } else {
            gotToHomeView() //Goes to HomeViewController
    }

}

ContactViewController (это представление доступно только для пользователей типа 1)

override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }


private func setupViews(){

        //Setupviews 

}

 @IBAction func continueAction(_ sender: Any) {

            gotToHomeView()

}

HomeViewController (это представление доступно для обоих пользователей, но тема пользовательского интерфейса отличается, как указано в разделе «Регистрация»)

override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
    }



private func setupViews(){

        if Utilities.isUserType1{
            setupViewsForType1User()
        } else {
            setupViewsForType2User()
    }

}

Это работает нормально, но проблема в том, что теперь я определил isUserType в Utilities, и он не идеально масштабируется. Для каждого изменения потока и пользовательского интерфейса мне нужно поставить условие if-else на основе этого параметра. Итак, теперь, если у меня есть другой тип пользователя, который нужно добавить в будущем, мне снова понадобится еще один оператор if-else и переключить пользовательский интерфейс и поток на основе этого.

Есть ли лучший подход к решению этой проблемы?


person Francis F    schedule 24.07.2019    source источник
comment
Определение вашей темы должно быть основано на userType / category   -  person Muhammad Waqas    schedule 24.07.2019


Ответы (1)


Вы можете проверить наличие изменений Тема там

Вам нужно изменить динамическую тему на основе другого пользователя, поэтому отправьте уведомление и примените тему, которая вам нужна

// We create a model
struct Theme {
    let theme: String
    let fontColor: UIColor
    let alpha: CGFloat
}

// We need a protocol for we don't want all view controller listen theme
protocol Themeable: class {
    func listenTheme()
    func didThemeChange(theme: Theme)
}


// Global notification name
let themeableNotificationName = Notification.Name(rawValue: "ThemeableNotification")

// Our protocol extension and observer notification
extension Themeable where Self: UIViewController {
    func listenTheme() {
        NotificationCenter.default.addObserver(forName: themeableNotificationName, object: nil, queue: nil) { [weak self] notification in
            guard let theme = notification.object as? Theme else { return }
            self?.didThemeChange(theme: theme)
        }
    }

}


// Notification sender themeController
class NotifyThemeController: UIViewController {


    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        // Create a model and post
        NotificationCenter.default.post(name: themeableNotificationName, object: Theme(theme: "Lorem", fontColor: .red, alpha: 1.0), userInfo: nil)
    }

}

// YViewController
class YViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // We need call this method for observer
        listenTheme()
    }


}
// YViewController conforms Themeable
extension YViewController: Themeable {
    func didThemeChange(theme: Theme) {
        // TODO UI
    }

}
// ZViewController
class ZViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // We need call this method for observer
        listenTheme()
    }


}
// ZViewController conforms Themeable
extension ZViewController: Themeable {
    func didThemeChange(theme: Theme) {
        // TODO UI
    }

}

Развлекайся!

person Vicaren    schedule 24.07.2019