将数据传递到 UITableView

Posted

技术标签:

【中文标题】将数据传递到 UITableView【英文标题】:Passing data into UITableView 【发布时间】:2020-04-10 20:23:17 【问题描述】:

我是 swift 新手,一直在尝试在视图控制器之间传递数据。我一直在尝试将数据从视图控制器传递到 UITableViewCell,但是一旦运行我的代码就没有效果了。

DetailViewController (将数据传递给 libraryViewController)

 func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        let DestViewController: LibraryMovieViewController = segue.destination as! LibraryMovieViewController

        DestViewController.movieTitle = movieTitle
        DestViewController.movieRelease = movieReleaseDate

    

UITableViewCell

class MovieSearchTableViewCell: UITableViewCell 

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var posterView: UIImageView!
    @IBOutlet weak var overviewLabel: UILabel!


LibraryViewController

struct libMovie 
    //let mainImage: UIImage
    let title: String
    let release: String


class LibraryMovieViewController: UIViewController 

    @IBOutlet weak var tableView: UITableView!

    var dataSource: [libMovie] = []
    var movieTitle: String!
    var movieRelease: String!

     override func viewDidLoad() 
         super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self

     // Do any additional setup after loading the view.
        loadDataSource()
    
    func loadDataSource()
       // dataSource.append(libMovie(title: " \(movieTitle)", release: " \(movieRelease)"))
    

extension LibraryMovieViewController: UITableViewDataSource, UITableViewDelegate

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 115
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return dataSource.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->  UITableViewCell 

        guard let movieCell = tableView.dequeueReusableCell(withIdentifier: "libCell", for: indexPath) as? LibraryMovieTableViewCell else 
            return UITableViewCell()
        
        let libMovie = dataSource[indexPath.row]

        movieCell.cellTitleLabel.text =  "Movie Title: \(movieTitle)"
        movieCell.cellReleaseLabel.text = "Release Date: \(movieRelease)"
        return movieCell
    

我希望当应用程序运行时,movieTitle 和 movieReleaseDate 从详细视图控制器传递并输入到库表格单元格中,这是通过点击详细视图控制器上的按钮来启动的。

但这似乎对程序没有影响,或者只是返回空白单元格。 控制台不报错,应用也不会崩溃

【问题讨论】:

【参考方案1】:

prepareForSegue 中,您已将数据传递给movieTitlemovieRelease,而您正在使用dataSource 扩充tableView 上的数据。

如果你想对多行不同的电影进行充气,或者将 [libMovie] 的对象和对象传递给 DestViewController.dataSource,或者在 numberOfRowsInSection 中返回 1,然后使用 movieTitle 和 movieRelease 在单元格中设置标签内容。

【讨论】:

我收到一条错误消息“无法分配“字符串”类型的值?在尝试从第一个视图控制器传递 DestViewController.dataSource = movieTitle 时键入“[libMovie]”,我也尝试从 numberOfRowsInSection 返回 1,但这似乎没有影响。 是的,由于 swift 中类型安全的明显原因,编译器不允许您将字符串传递给类型 [libMovie]。你需要做的是某种DestViewController.dataSource = [libMovie(title : "your title", release : "release content")]【参考方案2】:

在您的代码中,numberOfRowsInSection 正在返回 dataSource.count,但似乎没有将该数据传递给此视图控制器。

您可以将 numberOfRowsInSection 硬编码为 1 或从第一个视图控制器传递 dataSource 并更新您的 cellForRowAtIndexPath 方法。

【讨论】:

在 numberOfRowsInSection 返回 1 似乎对代码没有影响。我不确定我是否遵循你的第二个建议你的意思是从第一个视图控制器传递 dataSource 作为 DestViewController.dataSource = movieTitle,因为这会产生错误“无法分配类型'String的值?'输入“[libMovie]”“【参考方案3】:

目标视图控制器中的数据源是空的,你期望什么?

取消注释loadDataSource 中的行并重新加载表格视图。

func loadDataSource()
    dataSource.append(ibMovie(title: movieTitle, release: movieRelease))
    tableView.reloadData()

然后替换

movieCell.cellTitleLabel.text =  "Movie Title: \(movieTitle)"
movieCell.cellReleaseLabel.text = "Release Date: \(movieRelease)"

movieCell.cellTitleLabel.text =  "Movie Title: \(libMovie.title)"
movieCell.cellReleaseLabel.text = "Release Date: \(libMovie.release)"

【讨论】:

我已经按照您的建议编辑了代码,但没有数据传递给标题和详细信息文本标签,它们只显示“nil”

以上是关于将数据传递到 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

将 managedobject 从 uitableview 传递到文本字段以在核心数据模型中进行编辑

如何将数据从基于 plist 的 UITableView 传递到 UIViewController

在 UITableView 中传递和显示数据

使用自定义单元格在两个 UITableView 之间传递数据

将数据从 UIViewController 传递到 UIView

在 UITableView 中传递数据 beetwen 视图控制器