Swift 3中如何在TableView间获取、存储并传递URL?求技术支持
嘿,我来帮你搞定Swift 3里这个TableView传URL的问题!你在Java里能实现,转Swift其实思路大同小异,只是iOS的页面跳转和数据传递逻辑有自己的套路,我给你一步步拆解:
首先先修正你现有代码里的小问题:你写的var episodes = Episode是错误的,应该定义成数组类型var episodes = [Episode](),这样才能存储多个剧集数据;另外你的PlayView应该是一个TableViewController子类(比如叫PlayTableViewController),毕竟你要传值到另一个TableView嘛。
接下来分两步实现你的需求:
第一步:点击TableView单元格时获取目标URL
你需要实现TableView的点击代理方法tableView(_:didSelectRowAt:),在这个方法里拿到选中的剧集对象,提取它的URL。
第二步:传递URL到另一个TableView
这里分两种场景:临时传递(仅页面跳转时用)和持久化存储(退出APP再打开还能保留),我都给你写示例代码:
完整代码示例
import UIKit import AVFoundation class EpisodesTableViewController: UITableViewController { // 修正:定义为数组存储所有剧集 var episodes = [Episode]() var audioPlayer: AVAudioPlayer! // MARK: - TableView 点击代理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 1. 获取选中剧集的URL let selectedEpisode = episodes[indexPath.row] guard let targetURL = selectedEpisode.audioURL else { print("当前剧集没有有效URL") return } // --- 场景1:临时传递给下一个页面 --- // 假设你在Storyboard里给另一个TableVC设置了Storyboard ID为"PlayTableViewController" if let playVC = storyboard?.instantiateViewController(withIdentifier: "PlayTableViewController") as? PlayTableViewController { // 给目标控制器的属性赋值 playVC.selectedEpisodeURL = targetURL // 导航栏push跳转(如果是模态跳转就用present) navigationController?.pushViewController(playVC, animated: true) } // --- 场景2:持久化存储(可选,比如需要记住上次选的URL)--- UserDefaults.standard.set(targetURL.absoluteString, forKey: "SavedEpisodeURL") UserDefaults.standard.synchronize() } } // 你的剧集模型,确保有存储URL的属性 struct Episode { let title: String let audioURL: URL? // 其他你需要的属性比如时长、封面等 } // 接收URL的另一个TableViewController class PlayTableViewController: UITableViewController { // 用来接收传递过来的URL var selectedEpisodeURL: URL? override func viewDidLoad() { super.viewDidLoad() // 如果用了持久化存储,在这里读取 if let savedURLString = UserDefaults.standard.string(forKey: "SavedEpisodeURL"), let savedURL = URL(string: savedURLString) { selectedEpisodeURL = savedURL } // 现在你就可以用这个URL做任何操作了,比如加载音频、展示信息 if let url = selectedEpisodeURL { print("成功拿到的URL:\(url)") } } }
几个关键注意点
- 务必在Storyboard里给
PlayTableViewController设置正确的Storyboard ID,不然代码里的instantiateViewController会找不到控制器。 - 确保你的
episodes数组已经正确加载了数据,每个Episode对象的audioURL不是nil,不然拿不到有效链接。 - 如果不用Storyboard,而是纯代码创建控制器,直接初始化
PlayTableViewController()然后赋值selectedEpisodeURL再跳转就行。 - UserDefaults适合存简单数据,如果你需要存储大量剧集信息,后续可以考虑用Core Data或者本地文件存储。
这样应该就能解决你的问题啦,试试调整代码适配你的项目结构~
内容的提问来源于stack exchange,提问作者Amit Saha
相关产品推荐
相关产品推荐

