Косвенная передача данных в несвязанный NSViewController - PullRequest
0 голосов
/ 20 января 2019
  • Я новичок в разработке для MacOS и работаю над проектом для MacOS с использованием Xcode 10 и Swift 4.2.
  • Проект содержит в основном 3 контроллера вида.
  • Во-первых, ViewController ( главный экран приветствия, который разделяет две другие ) имеет две кнопки для вызова двух других соответственно.
  • Во-вторых, MakeEntry View Controller создает массив строк переменная данных с использованием структуры типа формы, состоящей из текстовых представлений и сохранения кнопка и т. д., которая в итоге просто сохраняет все входные данные в массив переменных данных с именем carrierArray
  • В-третьих, есть контроллер разделенного вида для отображения контроллер двух дочерних видов , а именно EntryList и EntryDetail
  • EntryList (левая панель) содержит табличное представление для отображения заголовков записей, а EntryDetail (правая панель) будет содержать описание записи заголовка (несколько как приложение по умолчанию для заметок macOS)

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

  • Я не могу использовать делегаты и протоколы, замыкания, сегменты или идентификаторы раскадровки для переноса этих данных, потому что я не перемещаюсь в Split View Controller сразу, а также потому, что я хочу хранить эти данные манипулировать им далее перед отображением на правой панели контроллера разделенного вида (EntryDetail) .
  • Я не могу понять, возможно ли достичь этой функциональности с помощью NSUserDefaults или CoreData.
  • Поэтому я попытался использовать Центр уведомлений после сохранения этого массива строк в Словаре , а именно notifDictionary , содержащий ключ с именем carryData для хранения в качестве объекта данных из центра уведомлений И с некоторыми исследованиями и некоторые попытки и ошибки, но безуспешно все это привело к невозможности получить эти данные в файле класса левой панели контроллера разделенного представления, а именно: (EntryDetail) .
  • Фрагменты кода приведены ниже, большое спасибо заранее за любезную помощь.

В контроллере MakeEntry View:

 notifDictionary = ["carryData": carrierArray]

        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dataCarrier") , object: nil, userInfo: notifDictionary)

В контроллере представления EntryList: (Пробовал использовать оба типа методов выбора по одному и даже использовать их вместе, но все без удачи! Пожалуйста, помогите!) Переменная datumDict и datumArray и ничего, кроме копий получателей для carrierArray и notifDictionary

var datumDict: [String:[String]] = [:]
var datumArray: [String] = []


override func viewDidLoad() {
    super.viewDidLoad()



    NotificationCenter.default.addObserver(self, selector: #selector(self.getThatDict(_:)), name: NSNotification.Name(rawValue: "dataCarrier") , object: nil)

    NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "dataCarrier") , object: nil, queue: nil, using: catchNotification)

    //datumArray = datumDict["carryData"]!

}




 @objc func onNotification(notification:Notification)
    {
        print(notification.userInfo!)
    }

func catchNotification(notification: Notification) -> Void
{
    let theDict = notification.object as! NSDictionary
    datumDict = theDict as! [String: [String]]
    guard let theData = notification.userInfo!["carryData"] as? [String:[String]] else { return }
    datumDict = theData
}


@objc func getThatDict(_ notification: NSNotification)
{
    print(notification.userInfo ?? "")
    if let dict = notification.userInfo as NSDictionary?
    {
        if let thatDict = dict["carryData"] as? [String: [String]]
        {
            datumDict = thatDict
        }
    }
}

1 Ответ

0 голосов
/ 21 января 2019

С оговоркой, что «глобалов и синглетонов следует избегать», звучит так, будто они хорошо подходят для того, что вы пытаетесь сделать. Когда вы почувствуете себя лучше в Какао, вы можете перейти к более изощренным способам достижения этого (внедрение зависимости). Подумайте об этом, когда вам станет комфортнее с Какао.

Создайте простой тип синглтона:

// AppState.swift

class AppState {
    // Basic singleton setup:
    static let shared = AppState()
    private init() {} // private prevents instantiating it elsewhere

    // Shared state:
    var carrierArray: [String] = []
}

Доступ к нему из ваших контроллеров представления:

// YourViewController.swift:

    @IBAction func doSomething(_ sender: Any) {
        AppState.shared.carrierArray = ...
    }

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

...