2017-04-22 22 views
0

我創建了一個應用程序,用於向用戶顯示最新和最熱門的國家/地區歌曲。我使用Firebase數據庫來發送和接收歌曲信息。這是在Xcode中使用Swift和UIKit。如何使用UserDefaults保存包含創建類的信息的數組

我創建了一個名爲Song的類,用於處理從Firebase獲取的所有信息。那個班級在下面。

import Foundation 
import UIKit 

class Song { 

//private var _imageURL: String! 
private var _videoURL: NSMutableURLRequest! 
private var _songTitle: String! 
private var _artistName: String! 
private var _cellNum: Int! 
private var _lastNum: Int! 
private var _spotifyLink: String! 
private var _itunesLink: String! 
private var _lyrics: String! 
private var _saved: Bool! 

// var imageURL: String{ 
//  return _imageURL 
// } 

var videoURL: NSMutableURLRequest{ 
    return _videoURL 
} 

var songTitle: String{ 
    return _songTitle 
} 

var artistName: String{ 
    return _artistName 
} 

var cellNum: Int{ 
    return _cellNum 
} 

var lastNum: Int{ 
    return _lastNum 
} 

var spotifyLink: String{ 
    return _spotifyLink 
} 

var itunesLink: String{ 
    return _itunesLink 
} 

var lyrics: String{ 
    return _lyrics 
} 

var saved: Bool{ 
    get{ 
     return _saved 
    } 
    set{ 
     _saved = newValue 
    } 
} 

init(videoURL: NSMutableURLRequest, songTitle: String, artistName: String, cellNum: Int, lastNum: Int, spotifyLink: String, itunesLink: String, lyrics: String, saved: Bool) { 

    //_imageURL = imageURL 
    _videoURL = videoURL 
    _songTitle = songTitle 
    _artistName = artistName 
    _cellNum = cellNum 
    _lastNum = lastNum 
    _spotifyLink = spotifyLink 
    _itunesLink = itunesLink 
    _lyrics = lyrics 
    _saved = saved 
} 
} 

在我的一個swift文件中,我初始化了一個新的Song類型數組來保存用戶保存的信息。

var savedSongs = [Song]() 

有故事板的一個內一個按鈕,如果用戶點擊它,它增加了保存的歌曲數組,當用戶進入到SavedVC故事板,所有保存在該項目的數組顯示給用戶。點擊按鈕的功能如下所示。

@IBAction func save(_ sender: Any) { 


    if(saveBtn.currentTitle == "Save"){ 

     song.saved = true 
     let p1 = song 
     savedSongs.append(p1) 
     //UserDefaults save here 
     saveBtn.setTitle("Unsave", for: .normal) 
    } 
    else if(saveBtn.currentTitle == "Unsave"){ 

     if(savedSongs.count != 0){ 
      //let items = (savedSongs.count) - 1 

      let title = song.songTitle 

      for save in 0...savedSongs.count-1{ 

       let removeSave = savedSongs[save] 
       let checkTitle = removeSave.songTitle 

       if(checkTitle == title){ 
        song.saved = false 
        savedSongs.remove(at: save) 
        //UserDefaults save here 
        saveBtn.setTitle("Save", for: .normal) 
        return 
       } 
      } 
     } 
    } 
} 

顯然,用戶有一個選項來保存,之後,他可以重新點擊按鈕來取消保存歌曲。在代碼中,對象

song.(attribute) 

被髮送並且是包含來自Song類的信息的所選單元的表示。因爲我現在有我的代碼,所以一切正常。問題是,當我離開應用程序時,數組中的內容不會保留。我曾嘗試UserDefaults,但我不知道如何與我擁有的數組做。

我想將數組保存爲用戶默認值,每次在上面的保存IBAction中單擊按鈕。

+0

私人後盾變量得到常數在斯威夫特可笑。只需使用'let'關鍵字即可'讓songTitle:String'。永遠不要將變量聲明爲使用(非可選)'init'方法初始化的隱式unwrapped選項。 – vadian

回答

0

您需要對對象進行編碼和解碼,以便將它們保存到UserDefaults。

class Song: NSObject, NSCoding { 
    let name: String 
    let url: String 

    init(name: String, url: String) { 
     self.name = name 
     self.url = url 
    } 

    required init(coder decoder: NSCoder) { 
     self.name = decoder.decodeObject(forKey: "name") as? String ?? "" 
     self.url = decoder.decodeInteger(forKey: "url") as? String ?? "" 
    } 

    func encode(with coder: NSCoder) { 
     coder.encode(name, forKey: "name") 
     coder.encode(age, forKey: "url") 
    } 
} 

然後檢索和保存:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // SAVE TO DEFAULTS 
     let song = Song(name: "Song", url: "http://song.com") 
     var songs = [Song]() 
     songs.append(song) 
     let encodedData = NSKeyedArchiver.archivedData(withRootObject: songs) 
     UserDefaults.standard.set(encodedData, forKey: "songs") 

     // RETRIEVE FROM DEFAULTS 
     if let data = UserDefaults.standard.data(forKey: "songs"), 
      let mySongs = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Song] { 
      mySongs.forEach({print($0.name, $0.url)}) 
     } else { 
      print("ERROR") 
     } 
    } 
} 
+0

這對我來說非常合適!非常感謝你! –

+0

編碼器始終編碼兩個非可選值。你爲什麼要檢查'nil'?這是永遠不會發生的。 – vadian

相關問題