2016-10-23 2 views
6

Я пытаюсь использовать постоянные данные и готовить для Segue вместе. Это то, что я до сих пор в: (View Controller 1)Постоянные данные и подготовка к Segue

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 


    if let tempItems = itemsObject as? [String] { 

     items = tempItems 

} 

в (View Controller 2):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "toSecondViewController" { 

     let itemsObject = UserDefaults.standard.object(forKey: "items") 

     var items:[String] 

     if let tempItems = itemsObject as? [String] { 

      items = tempItems 

      items.append(textField.text!) 

      print(items) 

     } else { 

      items = [textField.text!] 

     } 

     UserDefaults.standard.set(items, forKey: "items") 


    } 
} 

Я пытаюсь добавить элемент в массив на VC2. Затем я хочу передать массив в VC1, одновременно сохраняя его. Затем каждый раз, когда я закрываю и перезагружаю приложение, я могу распечатать массив. В сообщении об ошибке указано «Использование нерешенных элементов идентификатора». Я использую Xcode 8.0 и Swift 3.0.

enter image description here

enter image description here

+0

Какова ваша проблема? (Также вы пропустили закрывающий кронштейн в viewDidAppear) –

+0

Извините, я хочу очень ясно.По-видимому, есть «Использование нерешенных элементов идентификатора». –

+0

Я думаю, вам просто нужно создать экземпляр userdefaults.standard, когда вы делаете что-то с ним. Например, UserDefaults.standard(). Set (и т. Д. –

ответ

1

ИТАК, потому что вы сказали, что вы хотите, чтобы сохраняться данные более запусков приложений вам понадобятся значения по умолчанию для хранения ваших товаров. Поскольку Дэн уже предположил, что вы в основном делаете это правильно. Вы просто хотите установить переменную, которая ранее не была объявлена. Но я покажу вам это в следующем коде. Я также приложу второй подход, в котором элементы передаются следующему контроллеру представления во время выполнения segue.

Первый пример: представьте, что у нас есть два контроллера вида, например, в вашем примере. Первый контроллер представления содержит UITextField для ввода пользовательского текста. Всякий раз, когда мы переключаемся с первого контроллера представления на второй контроллер представления с помощью раскладки раскадровки (например, при нажатии кнопки), мы берем существующие тексты из предыдущих секций из пользовательских настроек по умолчанию и добавляем текущий пользовательский ввод, а затем сохраняем его обратно к пользовательским настройкам по умолчанию. Это происходит в первом контроллере представления:

class ViewController: UIViewController { 

@IBOutlet weak var textField: UITextField! 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    super.prepare(for: segue, sender: sender) 

    if segue.identifier == "toSecondViewController" { 
     let itemsFromDefaults = UserDefaults.standard.object(forKey: "items") 

     var items: [String] 

     if let tempItems = itemsFromDefaults as? [String] 
     { 
      items = tempItems 
      items.append(textField.text!) 
     } 
     else 
     { 
      items = [textField.text!] 
     } 

     print(items) 

     UserDefaults.standard.set(items, forKey: "items") 
    } 
} 
} 

Это первый контроллер вид выглядит очень похож на код, но я хотел бы добавить для полноты картины.

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

class ViewController2: UIViewController { 

private var items: [String]? // This is only accessible privately 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    self.items = UserDefaults.standard.object(forKey: "items") as? [String] 
} 

} 

Второй пример:. Вы можете также объявить внутреннюю открытую переменную/в ViewController2, так что вы можете установить его прямо с первого взгляда контроллер в исполнении segue. Чем вам не нужно будет захватывать элементы из пользовательских настроек по умолчанию в ViewController2. Для этого вы можете получить доступ к контроллеру представления места назначения segue, а затем перенести его в ViewController2 и непосредственно установить его элементы.

class ViewController: UIViewController { 

@IBOutlet weak var textField: UITextField! 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    super.prepare(for: segue, sender: sender) 

    if segue.identifier == "toSecondViewController" { 

     let itemsFromDefaults = UserDefaults.standard.object(forKey: "items") 

     var items: [String] 

     // [...] Do the stuff to get the items and add current input like before [...] 

     let destinationViewController = segue.destination as! ViewController2 

     destinationViewController.items = items 
    } 
} 
} 

class ViewController2: UIViewController { 

var items: [String]? // This is accessible from outside now 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    print(items) // We can now print this because it is set in prepareForSegue 
} 

} 

Я действительно надеюсь, что смогу помочь вам в этом и объяснил это понятным. Не стесняйтесь оставлять комментарий, если у вас есть какие-либо вопросы.

1

Вы забыли написать "пусть" или "вар" в viewDidAppear. Попробуйте это:

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 


    if let tempItems = itemsObject as? [String] { 

     let items = tempItems 

    } 
} 

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

override func viewDidAppear(_ animated: Bool) { 

    let itemsObject = UserDefaults.standard.object(forKey: "items") 

    var items: [String] 
    if let tempItems = itemsObject as? [String] { 

     items = tempItems 
    } 
} 
Смежные вопросы