Ответы пользователя по тегу macOS
  • Как обратиться из своего класса к классу ViewController для изменения IBOutlet или вызова методов?

    maestrro712
    @maestrro712
     iOS Developer
    Описываемый вами подход не самый удачный. ViewController неспроста так называется, именно он управляет всем view и его содержимым, соответственно, изменять свойства у IBOutlet'а должен только он. Чтобы избежать соблазна, лучше сразу декларировать все IBOutlet как private.
    Вместо вашего подхода лучше сделать так, чтобы ViewController был оповещен о произошедших изменениях и соответствующе апдейтил свой view. Сделать это можно многими способами, вот лишь некоторые из них:

    1) У вашего класса логики есть делегат. ViewController в методе viewDidLoad находит экземпляр вашего класса и назначает себя делегатом:

    class ViewController: NSViewController {
        
        @IBOutlet private weak var usernameLabel: NSTextField!
    
        func viewDidLoad() {
            super.viewDidLoad()
            let someInstance = //тут мы находим ваш экземляр (к примеру, он синглтон)
            someInstance.delegate = self
        }
    }
    
    extension ViewController: SomeInstanceDelegate {
        func updateUsernameOnUI(_ username: String) {
            usernameLabel.stringValue = username
        }
    }


    2) Ваш класс логики может оповещать своих обзерверов и ViewController становится обзервером:

    class ViewController: NSViewController {
        
        @IBOutlet private weak var usernameLabel: NSTextField!
    
        func viewDidLoad() {
            super.viewDidLoad()
            let someInstance = //тут мы находим ваш экземляр (к примеру, он синглтон)
            someInstance.addObserver(self)
        }
    }
    
    extension ViewController: SomeInstanceObserver {
        func usernameUpdated(_ username: String) {
            usernameLabel.stringValue = username
        }
    }


    3) Если никак не получается при инициализации связать класс логики и ViewController (что, в общем, не гуд), можно использовать NotificationCenter:

    class ViewController: NSViewController {
        
        @IBOutlet private weak var usernameLabel: NSTextField!
    
        func viewDidLoad() {
            super.viewDidLoad()
            NotificationCenter.default.addObserver(self, selector: #selector(usernameUpdate(:)), 
                                                                           name: Notification.Name("usernameUpdated"), object: nil)
        }
    }
    
    extension ViewController {
        @objc func usernameUpdate(_ notification: Notification) {
            guard let username = notification.userInfo?["username"] as? String else {
                  return
            }
            usernameLabel.stringValue = username
        }
    }
    Ответ написан
    Комментировать
  • Как настроить MySQL + Apache на OSX?

    maestrro712
    @maestrro712
     iOS Developer
    Скачайте MAMP (https://www.mamp.info/en/ ). Там есть Apache, PHP, MySQL и все это управляется из лаконичной нативной панельки. Платную версию брать совсем необязательно, лично я даже не знаю, что там есть
    Ответ написан
    1 комментарий