Можно ли изменить свойства подкласса из родительского класса в Swift 4? - PullRequest
0 голосов
/ 23 февраля 2019

Возможно, с помощью метода или замыкания?

Я создал контроллер представления подкласса моего контроллера представления суперкласса / родителя и поместил метки с текстом заполнителя в этот контроллер представления подкласса.

Я хочу установить значения меток для пустых строк из контроллера представления суперкласса / родительского представления или, в частности, из функции IBAction, которая вызывает появление контроллера представления подкласса.

Вот код, сначала из родительского класса, затем из подкласса ...

'' '

  class ViewController: UIViewController {
            @IBAction func leavingView(){
                    self.EntryViewController.entryDateLabel.text = ""
                    self.EntryViewController.entryLabel.text = ""
                    self.dismiss(animated: true, completion: nil)
            }

' '', затем из подкласса... '' '

  class EntryViewController: ViewController {

            @IBOutlet var entryDateLabel: UILabel!
            @IBOutlet var entryLabel: UILabel!
     }

' ''

Ответы [ 2 ]

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

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

В первом примере родительский объект устанавливает для себя свойства, которые слушает дочерний элемент (через didSet, затем обновляет свое представление соответствующим образом, однако это не идеально, потому что строковые поля entryDate и entry сами по себе бесполезны, почти избыточны в родительском.

class ParentViewController: UIViewController {

    var entryDate: String?
    var entry: String?

    @IBAction func leavingView(){
        self.entryDate = ""
        self.entry = ""
        self.dismiss(animated: true, completion: nil)
    }
}

class ChildViewController: ParentViewController {

    @IBOutlet var entryDateLabel: UILabel!
    @IBOutlet var entryLabel: UILabel!

    override var entryDate: String? {
        didSet {
            guard isViewLoaded else {
                return
            }
            entryDateLabel.text = entryDate
        }
    }

    override var entry: String? {
        didSet {
            guard isViewLoaded else {
                return
            }
            entryLabel.text = entry
        }
    }
}

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

class ParentViewController: UIViewController {

    @IBAction func leavingView(){
        self.dismiss(animated: true, completion: didLeaveView)
    }

    func didLeaveView() { }
}

class ChildViewController: ParentViewController {

    @IBOutlet var entryDateLabel: UILabel!
    @IBOutlet var entryLabel: UILabel!

    override func didLeaveView() {
        entryDateLabel.text = ""
        entryLabel.text = ""
    }

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

Поскольку ваши требования не так уж и ясны, я создал для вас демонстрацию, и в эту демонстрацию я добавил дочерний элемент ContainerViewController в родительский элемент ViewController, и из этого контроллера родительского представления вы можете изменить текст UILabel при нажатии кнопки.на UIButton родительского ViewController и код будет для ViewController

class ViewController: UIViewController {

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

    @IBAction func btnFromParentViewTapped(_ sender: Any) {

        //Here get the child of your parent view controller
        if let containerView = self.children[0] as? ContainerViewController {
            containerView.lblContainer.text = ""
        }
    }
}

и ContainerViewController код будет:

class ContainerViewController: UIViewController {

    @IBOutlet weak var lblContainer: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}

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

И ваш результат будет:

enter image description here

Как вы можете видеть, когда я нажимаю на кнопку, название которой гласит Change Container label text меткатекст из ContainerViewController установлен в пустую строку.

Для получения дополнительной информации проверьте ЭТО демонстрационный проект.

...