我已经构建了一个meme生成器,并将处理meme创建的视图控制器嵌入到一个选项卡栏视图控制器中。第一个选项卡显示一个表视图,我试图让表视图在通过活动视图保存后显示meme。我已经在我的App Delegate文件中添加了一个meme数组(我知道这是有争议的,但这是本练习的要求),并且我已经确认meme正在被保存并传递到App Delegate文件。
每当用户创建一个新的meme时,我想在table视图中显示保存的meme的图像和文本。这是我所拥有的,但这不起作用。

import UIKit

class TableViewMemesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var memes: [Meme]!

    override func viewDidLoad() {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        memes = appDelegate.memes
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return memes.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
        let meme = memes[indexPath.row]
        cell?.imageView?.image = meme.memedImage
        cell?.textLabel?.text = meme.topText
        return cell!
    }

}

我哪里做错了?cellForRowAt的过程对我来说仍然是新的和令人沮丧的。Here是指向回购协议的链接。

最佳答案

当您在UITabBar选项卡之间导航时,viewDidLoad不会被触发,只有在创建了选项卡栏之后才会被触发。
为了使表视图反映这些更改,您需要在viewWillAppear而不是viewDidLoad中处理这些更改。
所以你会有:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    memes = appDelegate.memes
}

您需要向memes添加一个属性观察者,如下所示:
var memes: [Meme]! {
    didSet {
        tableView.reloadData()
    }
}

编辑:正如@Andrea mugnani提到的,您需要为您的表视图连接IBOutlet
@IBOutlet weak var tableView:UITableView!

10-08 06:54