Xcode中Swift 4项目排除MP3文件的问题求助
解决Swift 4中UITableView排除指定MP3文件的问题
嘿,我明白你的问题了——你现在用replacingOccurrences(of:with:)只是把"Mr. Blue Sky"的名称改成了空字符串,但对应的数据源条目(比如歌曲URL)还在数组里,所以UITableView依然会渲染这个空内容的cell,点击时自然还是会触发播放操作。要彻底排除这个MP3,得从数据源数组里直接移除对应的条目,而不是修改字符串内容。
具体解决方案
假设你的数据源是存储歌曲URL的数组(或者包含歌曲信息的自定义结构体数组),你需要在加载数据时过滤掉目标MP3:
1. 如果数据源是URL数组
如果你的歌曲是从Bundle里加载的MP3文件,修改加载逻辑,直接过滤掉"Mr. Blue Sky"对应的URL:
var happySongs: [URL] = [] func loadHappySongs() { guard let urls = Bundle.main.urls(forResourcesWithExtension: "mp3", subdirectory: "HappySongs") else { return } // 过滤掉名称为"Mr. Blue Sky"的MP3 happySongs = urls.filter { url in // 从URL中提取不带后缀的歌曲名称 let songName = url.deletingPathExtension().lastPathComponent return songName != "Mr. Blue Sky" } // 刷新TableView yourTableView.reloadData() }
2. 如果数据源是自定义歌曲结构体
如果你用了自定义结构体来存储歌曲名称和URL,比如:
struct Song { let name: String let url: URL } var happySongs: [Song] = []
那过滤逻辑会更直接:
// 加载数据后过滤 happySongs = happySongs.filter { $0.name != "Mr. Blue Sky" } // 刷新TableView yourTableView.reloadData()
为什么原来的方法无效?
mySong = mySong.replacingOccurrences(of: "Mr. Blue Sky", with: "")只是修改了单个字符串的内容,但数据源数组的长度并没有变化——TableView的numberOfRowsInSection依然会把这个空字符串的条目算进去,所以会生成一个空白cell。点击时,你还是会从数据源里拿到对应的MP3 URL,自然会播放。而过滤数组是从根源上移除了这个条目,TableView就不会再渲染它,也就没有空白可点击区域了。
内容的提问来源于stack exchange,提问作者VikSn0w
相关产品推荐
相关产品推荐

