Правильный способ наследовать CustomViewController с «зависимостями» - PullRequest
0 голосов
/ 29 апреля 2019

Недавно я написал приложение с одной сценой и ViewController.Мне пришлось установить пользовательское фоновое изображение для View, которым управляет ViewController (т.е. мой вид сверху содержал UIImageView).Позже мне пришлось реализовать некоторую логику в ViewController, чтобы она правильно вращала / изменяла изображение при повороте экрана.Также мне пришлось переписать некоторые свойства, такие как preferredStatusBarStyle для ViewController.

Теперь мне нужно реализовать еще пару сцен / экранов в моем приложении, и получается, что все они должны иметь одинаковый дизайн сэто текущий экран, так что я думаю, что имеет смысл, если я создам CommonViewController, который содержит эту общую логику, связанную с вращением, для фонового изображения, чтобы я мог наследовать все остальные ViewController от этого CommonViewController.Единственная проблема, с которой я сталкиваюсь, заключается в том, что CommonViewController «требует», чтобы управляемое представление имело свойство backgroundPicture: UIView, которое я не знаю, как обеспечить.

Если я создаю новый файл CommonViewControllerвместе с XIB-файлом я могу добавить представление backgroundPicture изображения в XIB и связать его с кодом (с помощью обычного подхода «control-drag»), но, очевидно, это не будет работать, поскольку нет гарантии, что представления, которыенаследовать CommonViewController будет иметь это свойство.Как правильно решить эту проблему без взломов на iOS в Swift?

К сожалению, я не смог найти решение, возможно, я искал что-то не так.Кажется, что мне как-то нужно унаследовать CommonViewController для каждой сцены (для каждой CustomViewController), но я также должен каким-то образом установить вид сверху каждого из этих контроллеров так, чтобы он равнялся некоторым CommonView, чтобы CommonViewController не падает, когда я пытаюсь получить доступ к @IBOutlet weak var backgroundPicutre: UIImageView!.


Очевидным способом было бы определить некоторый метод или свойство в CommonViewController, чтобы контроллеры, которые его наследовали, могли реализовать/ переопределить его, но это кажется немного хакерским, поскольку он все еще требует вставки копии в каждый ViewController, который наследует CommonViewController.

Как я представлял себе решение: я создаю CustomViewController: CommonViewController, затем я создаюпросмотрите контроллер в моей раскадровке и измените свойство «Class» на «CustomViewController» (в редакторе свойств), затем я выбираю представление, соответствующее этому вновь добавленному контроллеру, и изменяю свойство «Class» на «BackgroundImageView . But I'm not sure if it's the correct way to do (also I doubt that CustomViewController * 1037».* IBOutlet field bakcgroundImageView with the corresponding UIView from BackgroundImageView`, поэтому я хотел спросить экспертов, что они об этом думают.

1 Ответ

1 голос
/ 29 апреля 2019

Я думаю, что вы должны определять свой базовый контроллер (CommonViewController) изначально в коде, то есть не используйте никакие xibs / раскадровки для базового контроллера.Это не значит, что вы должны полностью избавиться от раскадровок / XIBS.Интерфейс для всех других контроллеров представления, кроме CommonViewController, все еще может быть реализован с xibs / раскадровками.

В этом случае реализация CommonViewController может выглядеть следующим образом:

import UIKit

class CommonViewController: UIViewController {
    // use this property every time you need to 
    // manipulate backgroundPicture
    var backgroundPicture: UIImageView  = {
        // Replace with your image name
        let image = UIImage(named: "BackgroundPicture")!
        let imageView = UIImageView()
        imageView.image = image
        return imageView
    }()

    override func viewDidLoad() {
        // If subclass overrides viewDidLoad() 
        // it should contain super.viewDidLoad()
        super.viewDidLoad()

        view.addSubview(backgroundPicture)

        // Align backgroundPicture to bounds of superview
        // You can remove this code and implement
        // your own alignment with frames or Autolayout
        backgroundPicture.frame = view.bounds

        // Send backgroundPicture to back of the view
        // Otherwise backgroundPicture may overlap views added in subclasses
        view.sendSubviewToBack(backgroundPicture)
    }

    override func viewDidLayoutSubviews() {
        // If subclass overrides viewDidLayoutSubviews()
        // It should contain super.viewDidLayoutSubviews() 
        super.viewDidLayoutSubvews()

        // Align backgroundPicture to bounds of superview
        // You can remove this code and implement
        // your own alignment with frames or Autolayout
        backgroundPicture.frame = view.bounds
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...