2016-02-16 4 views
0

Это странная ошибка в моей программе, которая, по моему мнению, является логической ошибкой с моей стороны, или я что-то злоупотребляю.NSUserDefaults не сохраняется - логическая ошибка?

Положительно, когда значение вводится в NSTextField, оно не сохраняется, а вместо этого устанавливается как placeholderValue этого TextField. Во второй раз, когда загружается представление SavePreferences и выполняется функция сохранения, значение placeholderValue записывается в NSUserDefaults. Я хочу обойти этот средний шаг и просто записать значение NSTextField непосредственно в NSUserDefaults в первый раз.

Я пытаюсь сохранить значение в NSUserDefaults. Что происходит, когда открывается окно SavePreferences, это значение не сохраняется, а скорее задается как значение-заполнитель. Когда представление настроек снова открывается, placeholderString содержит значение. Именно в этот момент, когда нажимается btnSaveApiKey (.synchronize() и/или .setObject()), записывается значение заполнитель.

Я вызываю некоторые функции из строя или должен добавить некоторые функции в мой класс SavePreferences для обработки какого-то события какао, о котором я не знаю?

import Cocoa 

class SavePreferences: NSViewController { 
@IBOutlet weak var apiKeySavedText: NSTextField! 
let userApiKeyConstant = "userApiKey" 
let defaults = NSUserDefaults.standardUserDefaults() 
var apiKeyTitle = NSUserDefaults.standardUserDefaults().stringForKey("userApiKey") 

//MARK textfield for api key 
@IBOutlet weak var textFieldApiKey: NSTextField! 

//MARK save API Key as default preference 

// SAVE FUNCTION 
@IBAction func btnSaveApiKey(sender: AnyObject) { 

    //save NSUserDefaults value 
    defaults.setObject(self.textFieldApiKey.stringValue, forKey: userApiKeyConstant) 

    // force save of NSUserDefaults with synchronize() 
    defaults.synchronize() 

    print("apikey saved as", self.apiKeyTitle) 
    apiKeySavedText.hidden = false 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    apiKeySavedText.hidden = true 
    if(self.defaults.valueForKey(userApiKeyConstant) != nil) { 
     textFieldApiKey.placeholderString = self.defaults.stringForKey(userApiKeyConstant) 
    } 
    } 
} 
+0

Обратите внимание, что использование синхронизации больше не требуется, и теперь Apple не обескураживает. Тем не менее, я не понимаю ваш вопрос. Вы говорите, что при запуске 'btnSaveApiKey' значения' NSUserDefaults' не установлены? – Michael

+0

Спасибо, Майкл. Это как-то хранится где-то, потому что, когда представление загружается снова, оно появляется в тексте-заполнителе текстового поля. Однако он не хранится в NSUserDefaults. Только после того, как он установлен в качестве текста заполнителя, btnSaveApiKey записывает значение в NSUserDefaults. – user43633

+0

Но я не понимаю, чего ты хочешь. На данный момент вы читаете NSUserDefaults и помещаете его в заполнитель, который, как я полагаю, работает. Затем вы нажимаете кнопку и записываете текущее текстовое значение (т. Е. Не заполнитель) обратно в NSUserDefaults. Если вы снова запустите, заполнитель должен появиться со значением, которое вы ввели и сохранили ранее. Это то, что вы хотите, а какая часть не работает? Или вы говорите, что не можете найти его в местоположении NSUserDefaults, и в этом случае, возможно, вы ищете не то место. – Michael

ответ

1

Я предполагаю, что вы сбиты с толку, потому что ваша функция сохранения не печатает сохраненную строку. Это потому, что вы объявили apiKeyTitle один раз в начале. Таким образом, это всегда то, что вы сохранили ранее. Для доступа к текущему значению, измените следующие

print("apikey saved as", self.apiKeyTitle) 

к

print("apikey saved as ", defaults.stringForKey(userApiKeyConstant)) 

и удалить переменную с

var apiKeyTitle = NSUserDefaults.standardUserDefaults().stringForKey("userApiKey") 

, в случае, если вам не нужно куда-то в вашем коде.

Смежные вопросы