Разрешение пользователю создавать ключ и значение в Swift userdefaults

В настоящее время мое приложение добавляет значение к двум разным ключам в userDefaults, добавляемые значения - это «Имя песни» и «BPM» (удары в минуту), два ключа - sName и sBPM.

Что я хочу сделать, так это позволить пользователю создать ключ с названием песни и значением BPM. что позволило бы им выбрать песню из UiPickerView, и приложение могло бы отображать BPM.

В принципе. Как я могу позволить пользователю создать ключ из текстового ввода, а не присваивать значение предварительно созданному ключу.

Надеюсь, это имеет смысл. Я очень новичок в Swift и программировании в целом.


person wades    schedule 19.09.2018    source источник
comment
Ключ — это просто строка, а ввод текста — это просто строка, так что никаких сложностей.   -  person matt    schedule 19.09.2018


Ответы (3)


Учитывая, что у вас есть UITextField в вашем пользовательском интерфейсе для ввода имени песни и значения BMP со ссылкой на него в вашем коде как songTextField и bmpTextField соответственно, при нажатии клавиши возврата или всякий раз, когда вы хотите выполнить операцию, вы можете использовать ниже код

if let songName = songTextField.text, let bmpValue = bmpTextField.text {
    UserDefaults.standard.set(bmpValue, forKey: songName)
}
person Deepika    schedule 19.09.2018
comment
Привет, Дипика, да, пользователь введет оба значения, например, в пользовательском интерфейсе есть 2 текстовых ввода: один для названия песни, а другой для ударов в минуту, поэтому он должен ввести «Hotel California» в поле имени и «74» в поле BPM. Затем имя будет добавлено в окно выбора пользовательского интерфейса, и при нажатии на него в окне выбора оно будет отображать «74» в метке. - person wades; 19.09.2018
comment
И пользователь сможет добавить несколько песен в приложение. - person wades; 19.09.2018
comment
Я обновил ответ. Как вы поддерживаете источник данных для UIPickerView. вы можете добавить songName к источнику данных чуть ниже, где вы устанавливаете значения в своих UserDefaults - person Deepika; 19.09.2018

В этом случае вы можете установить ключ как SongName и значение BPM в качестве его значения. Как ниже код

let songs = ["AAA", "BBB", "CCC"]
let BPMValue = 1.5

UserDefaults.standard.set(BPMValue, forKey: songs[index])
UserDefaults.standard.synchronize()

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

person Karamjeet Singh    schedule 19.09.2018
comment
Спасибо Karamjeet, так что каждый раз, когда пользователь добавляет песню и ее удары в минуту, он будет создавать новый ключ, представляющий собой название песни и значение, равное ударам в минуту? - person wades; 19.09.2018

создайте структуру для деталей, которые вы хотите для песни

struct songDetails {
   var songName : String
   var songBPM : String
}

Теперь вы можете создать массив, используя этот тип структуры,

var songDetailsArray : [songDetails] = []

И вы можете добавить новую песню в массив, взяв входные данные из UITextFields

songDetailsArray.append(songDetails(songName: songNameTextField.text!, songBPM: bpmTextField.text!))

И легко добавить его в UIPIckerView, используя тот же массив

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return songDetailsArray[row].songName
}

Вы можете выбрать песню из UIPickerView и получить доступ к ее имени,

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
   let songName = songDetailsArray[row].songName
   let correspondingBpm = songDetailsArray[row].songBPM
   print(correspondingBpm)        //this is the corresponding bmp to the seleced song name 
   UserDefaults.standard.set(songName, forKey: "sName")
   UserDefaults.standard.set(correspondingBpm, forKey: "sBPM")
}

Здесь вы создаете только два значения UserDefaults для вашей песни и соответствующий BPM.

И вы можете получить доступ к этому значению UserDefaults в любом месте проекта,

let songName = UserDefaults.standard.integer(forKey: "sName")
let songBPM = UserDefaults.standard.integer(forKey: "sBPM")

Это может вам помочь, теперь вы можете найти BPM, соответствующий названию песни.

person Yashvir Walia    schedule 19.09.2018
comment
Спасибо, Yashvir, теперь я получаю ошибку SIGABRT, похоже, это из-за этого: после UIViewController - person wades; 22.09.2018
comment
включите [UIPickerViewDataSource] и [UIPickerViewDelegate] в свой класс UIViewController, и вы также должны назначить их делегатов для себя - person Yashvir Walia; 25.09.2018
comment
Итак, теперь я могу добавить пользовательские значения по умолчанию, и я открыл файл plist, в котором хранятся UD, и я вижу, что он сохраняется и отображается в plist так, как я хочу. Однако. ничего не отображается в моем окне выбора. Что я должен проверить, чтобы найти проблему здесь? - person wades; 09.10.2018
comment
ваш должен быть songDetailsArray должен быть пустым - person Yashvir Walia; 07.01.2019