swift - 单击 VC1 的行(带 segue)不会打开 VC2
问题描述
假设我有一个容器视图,其中有一个 UI 视图(类别专辑视图),一个 tableView 为这个 UI 视图提供数据源。
问题是当我单击“类别专辑视图”行时,它没有打开以下名为“专辑名称”的tableView。我正在使用 segue id/prepare()
进行传输,我检查了我的代码,segue 设置prepare()
在代码和情节提要中。欢迎任何评论/提示!
///我的代码如下,
///更新我的代码,作为vadian的评论,评论tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
确实解决了这个问题。
CategoryAlbumView.swift
import UIKit
import AVKit
class CategoryAlbumView: UIViewController {
var directoryContents = [URL]()
var songName: String?
var artistName: String?
var albumName: String?
var albumArtwork: UIImage?
var tableData = [SongData]()
var albumArray = [String]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
tableView.delegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.retrieveSongsfromLocalDir()
var seen = Set<String>()
var unique = [SongData]()
for message in tableData {
if !seen.contains(message.albumName) {
unique.append(message)
seen.insert(message.albumName)
}
}
// convert Set to Array
albumArray = Array(seen)
print("seen count", seen.count)
// let testArray = tableData.filter { $0.albumName == "Beauty In The Mundane"}
// print("TestArray count", testArray.count)
// refresh table data.
tableView.reloadData()
}
func retrieveSongsfromLocalDir() {
do {
tableData.removeAll()
// Get the document directory url
let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
// Get the directory contents urls (including subfolders urls)
directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil)
// if you want to filter the directory contents you can do like this:
let mp3Files = directoryContents.filter{ $0.pathExtension == "mp3" }
// get music metadata (artist, album)
for url in mp3Files {
let asset = AVAsset(url: url)
let metaData = asset.metadata
// to use url's name for song name to avoid there is no metaData info for songs.
let songTitle = url.deletingPathExtension().lastPathComponent
if songTitle != "" {
songName = songTitle
} else {
songName = "Unknown Song"
}
if let artist = metaData.first(where: {$0.commonKey == .commonKeyArtist}), let value = artist.value as? String {
artistName = value
} else {
artistName = "Unknown Artist"
}
if let album = metaData.first(where: {$0.commonKey == .commonKeyAlbumName}), let value = album.value as? String {
albumName = value
// print("Album:",albumName)
} else {
albumName = "Unknown Album"
}
if let albumImage = metaData.first(where: {$0.commonKey == .commonKeyArtwork}), let value = albumImage.value as? Data {
albumArtwork = UIImage(data: value)
} else {
albumArtwork = UIImage(named: "Album-50")
print("artWork is not found!")
}
tableData.append(SongData(songName: songName!, artistName: artistName!, albumName: albumName!, albumArtwork: albumArtwork!, url: url))
}
} catch {
print(error)
}
}
}
extension CategoryAlbumView: UITableViewDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "CategoryAlbumSongs":
if let indexPath = self.tableView.indexPathForSelectedRow {
let controller = segue.destination as! CategoryAlbumSongs
let cellText = albumArray[indexPath.row]
print("Prepare ========= Prepare ")
controller.albumSongs = tableData.filter { $0.albumName == cellText}
}
default: break
}
}
}
// MARK: - UITableViewDataSource
extension CategoryAlbumView: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return albumArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = albumArray[indexPath.row]
cell.imageView?.image = UIImage(named: "Album-50")
return cell
}
}
/// CategoryAlbumSongs.swift
import UIKit
class CategoryAlbumSongs: UITableViewController {
var albumSongs = [SongData]()
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return albumSongs.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = albumSongs[indexPath.row].songName
cell.detailTextLabel?.text = albumSongs[indexPath.row].artistName
cell.imageView?.image = albumSongs[indexPath.row].albumArtwork
return cell
}
}
解决方案
推荐阅读
- html-table - Docx4j 意外元素(uri:“http://schemas.openxmlformats.org/wordprocessingml/2006/main”,本地:“p”)
- php - $this->db->insert_id(); 对于插入 ID 工作正常。但我也想插入企业名称
- mysql - 转换器 Perl 脚本修复
- python - 怎么把这些词变成句子
- python - 如何访问未出现在已解析文本中的 li 元素?
- ajax - DataTables 警告:table id=extension - 无法重新初始化 DataTable。有关此错误的更多信息,请参阅 http://datatables.net/tn/3
- jquery - 如何在jquery的while循环中捕获转义按键事件?
- angularjs - 使用 angular js post 到 django 后端会产生 414 错误
- python - 即使我确定我正确导入了名称“ClassName”(Python)
- cryptography - 像以太坊地址一样保持 Sawtooth 公钥“公开”是个好主意吗?