我正在使用swift创建一个iOS应用程序,用户可以在其中播放音乐。我已经在.swift
文件中创建了一个结构和一组应用程序提供的歌曲。
struct Song {
var title: String
var artist: String
var lyrics: String
}
var songs: [Song] = [
Song(title: Song One Title", artist: "Song One Artist", lyrics: ""),
Song(title: Song Two Title", artist: "Song Two Artist", lyrics: "Song Two Lyrics"),
Song(title: Song Three Title", artist: "Song Three Artist", lyrics: ""),
];
数组songs
填充UICollectionViewController
,效果很好!但是,我希望用户能够通过按下按钮来喜欢一首歌。然后他们喜欢的所有歌曲将在另一个UICollectionViewController
中。我一直在尝试多个场景,但到目前为止它们都失败了。所以我决定来这个社区寻求帮助。
这是我的一个想法。我会在结构中创建另一个变量Song
,称为“喜欢”,它将是一个布尔。
struct Song {
var title: String
var artist: String
var lyrics: String
var liked: Bool
}
var songs: [Song] = [
Song(title: Song One Title", artist: "Song One Artist", lyrics: "", liked: false),
Song(title: Song Two Title", artist: "Song Two Artist", lyrics: "Song Two Lyrics", liked: false),
Song(title: Song Three Title", artist: "Song Three Artist", lyrics: "", liked: false),
];
我想知道如何才能将用户喜欢的歌曲indexPath
的bool从false更改为true?我还希望将其保存到UserDefaults
,以便下次用户访问该应用时,之前的歌曲仍然会被喜欢。最后,我想在UICollectionViewController
中显示bool liked
等于true的所有歌曲。
如果您有任何想法,如果您可以分享它们会很棒!非常感谢您的帮助!
答案 0 :(得分:2)
我可以想到一些方法
您可以将所有喜欢的Song
个对象保存到UserDefaults
。为此,您需要添加一个将Song
结构转换为[String: Any]
的方法,即属性列表。然后,您可以将此[String: Any]
保存到UserDefaults
。这样做的缺点是当用户删除歌曲时,您必须从UserDefaults
删除它。同步它非常困难。
不是像第一种方法那样说出你所做的所有歌曲,而是保存所有歌曲,就像你尝试过的那样,添加一个liked
属性。显然,您还需要一种方法将结构转换为[String: Any]
。
存储整个Song
结构可能有点矫枉过正。如果歌曲将保持相同的顺序并且不再插入或删除歌曲,那么您可以只存储喜欢的歌曲的索引。如果用户喜欢第一首和第三首歌曲,则将数组[1, 3]
存储到UserDefualts
。
我认为这是4中最好的方法。虽然设置核心数据栈可能更困难。有很多关于如何使用Core Data的教程。您将在核心数据中存储Song
个实体,并具有liked
属性。
答案 1 :(得分:1)
您不应将UserDefualts用于存储。将其编码并将其保存到json文件:
struct Song: Codable {
let title: String
let artist: String
let lyrics: String
var liked: Bool
}
struct Queue: Codable {
var songs: [Song] = []
var data: Data {
return try! JSONEncoder().encode(self)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var queue = Queue()
queue.songs = [
Song(title: "Song One Title", artist: "Song One Artist", lyrics: "", liked: false),
Song(title: "Song Two Title", artist: "Song Two Artist", lyrics: "Song Two Lyrics", liked: false),
Song(title: "Song Three Title", artist: "Song Three Artist", lyrics: "", liked: false),
]
let preferences = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
let queueURL = preferences.appendingPathComponent("queue.json")
try! queue.data.write(to: queueURL)
let data = try! Data(contentsOf: queueURL)
let loadedQueue = try! JSONDecoder().decode(Queue.self, from: data)
print(loadedQueue)
}
}
这将打印
Queue(歌曲:[QueuePlayer.Song(标题:“Song One Title”,艺术家:“Song One 艺术家“,歌词:”,“喜欢:假”,QueuePlayer.Song(标题:“歌曲二 标题“,艺术家:”歌曲二艺术家“,歌词:”歌曲二歌“,喜欢: QueuePlayer.Song(标题:“歌曲三题”,艺术家:“宋三 艺术家“,歌词:”“,喜欢:假)])