You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:29:56