首页 > 解决方案 > 单击 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
    }
}

标签: swiftuitableviewsegue

解决方案


推荐阅读