Как остановить возврат переменной к значению по умолчанию при чтении в другом файле - PullRequest
0 голосов
/ 08 января 2020

У меня есть класс DiscoveredSerialNumbers, к которому я хочу получить доступ из различных файлов swift:

class DiscoveredSerialNumbers {
    var snConnect: String = ""
}

В моем ViewController я изменяю значение snConnect на основе выбора из представления выбора.

class ViewController: UIViewController, UIPickerViewDataSource,UIPickerViewDelegate {

@IBOutlet weak var SerialNumbers: UIPickerView!

var serialNums: [String] = [String]()
...
override func viewDidLoad() {
...

    SerialNumbers.dataSource = self
    SerialNumbers.delegate = self
}
...
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    let global = DiscoveredSerialNumbers()
    global.snConnect = serialNums[row]
    print(serialNums[row])
    print(global.snConnect)
}
}

Когда я распечатываю новое значение snConnect, установленное в следующей строке:

global.snConnect = serialNums[row]

Сразу после этого я получаю новое обновленное значение snConnect.

Однако, когда я пытаюсь чтобы получить доступ к обновленному значению snConnect в другом файле swift, который управляет другим ViewController в следующем коде:

 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    let global = DiscoveredSerialNumbers()
    var sn = global.snConnect
    ...
}

Значение snConnect возвращается к исходному значению, которое "".

Как остановить возврат значения к исходному значению? Я думаю, что это как-то связано со мной при инициализации класса DiscoveredSerialNumbers, но я не знаю, как иначе получить доступ к значению snConnect в другом файле swift.

Редактировать: благодаря комментариям Дона я пытаюсь получить значение snConnect сохраняется между экземплярами запуска приложения. Я хочу установить значение snConnect в главном приложении и получить к нему доступ при запуске расширения основного приложения, в данном случае пользовательского расширения клавиатуры.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Для расширения приложения для доступа к данным, хранящимся в его приложении-контейнере, и приложение, и расширение должны быть частью одной группы приложений. Группы приложений устанавливаются в разделе «Подписание и возможности» XCode для вашего проекта.

Когда ваше приложение и расширение входят в одну группу приложений, вы можете использовать следующий код для установки значения глобальной переменной:

let defaults = UserDefaults(suiteName:"group.dataShare")
defaults?.set(serialNums[row], forKey: "snConnect")

Где group.dataShare - это имя вашей группы приложений.

Чтобы получить значение, вы можете использовать следующий код в своем добавочном номере:

let defaults = UserDefaults(suiteName:"group.dataShareImada")
var sn = defaults?.string(forKey: "snConnect")
0 голосов
/ 08 января 2020

Обновление: вопрос немного вводил в заблуждение, вам нужно сохранить переменную. Я не уверен, если UserDefaults для приложения и расширения клавиатуры одинаковы, вы можете попробовать это.


class DiscoveredSerialNumbers {

    static var main = DiscoveredSerialNumbers()
    var snConnect: String {
        get {
            // Read from UserDefaults
            return UserDefaults.standard.string(forKey: "snConnect") ?? ""
        }
        set {
            // Save to UserDefaults
            UserDefaults.standard.set(newValue, forKey: "snConnect")
        }
    }
    init() {
        print("New instance of DiscoveredSerialNumbers initialized.")
    }
}

Вы можете сделать это несколькими различными способами, однако самый простой из них - создание одиночного набора DiscoveredSerialNumbers. (), поэтому ваш объект и значения могут использоваться глобально через него.

(хотя этот метод следует использовать с осторожностью, он может вызвать ряд проблем)

class DiscoveredSerialNumbers {

    static var main = DiscoveredSerialNumbers()
    var snConnect: String = ""
    init() {
        print("New instance of DiscoveredSerialNumbers initialized.")
    }
}

сейчас всякий раз, когда вы звоните DiscoveredSerialNumbers.main.snConnect, старое значение будет сохранено и может быть использовано / изменено из любого места.

Редактировать: Вот пример кода игровой площадки, чтобы вы могли проверить, как работают одиночные игры


class Singleton
{
    var someVariable = ""
    static var main = Singleton()
}

class ClassA
{
    init() {
        Singleton.main.someVariable = "Hey I was changed in Class A"
    }
}

class ClassB
{
    init() {
        print(Singleton.main.someVariable)
        Singleton.main.someVariable = "And now I'm changed in class B"
    }
}

let _ = ClassA()
let _ = ClassB()
print(Singleton.main.someVariable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...