为什么文本标签是空的,而调试器说它不是? Swift 应用?

Why is the text label empty when debugger says it is not? Swift app?

我是 swift 的新手,我试图让我的文本标签显示在我的 table 视图中,但它就是没有显示。以下是我的文件,它确实成功构建。

UI 的树巢: --主视图控制器 ----UI 表格视图 ------主视图控制器单元格

我开始认为我在错误的地方重新加载 table。

在此先感谢您的帮助!

当我删除 self.mainTableView.reloadData() 时,将不会显示任何单元格。 此时此刻,我仍然可以单击单元格,它们确实会使用以下调试器行进行响应:

You selected Number 0 You selected Number 1 You selected Number 2

MainViewController.swift

import Foundation
import Locksmith
import UIKit
import Alamofire
import SwiftyJSON
import Alamofire
import JWTDecode

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var userFeed = [UserFeedRow]()


    @IBOutlet weak var mainTableView: UITableView!

    override func viewDidLoad() {

        mainTableView.registerClass(MainViewTableViewCell.self, forCellReuseIdentifier: "mainTableViewCell")

        mainTableView.delegate = self
        mainTableView.dataSource = self
        mainTableView.separatorStyle = UITableViewCellSeparatorStyle.None

    }

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

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("You selected Number \(indexPath.row)")
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
        UITableViewCell {

        println("celler \(indexPath.row)")

        var cell:MainViewTableViewCell = self.mainTableView.dequeueReusableCellWithIdentifier("mainTableViewCell", forIndexPath:indexPath) as MainViewTableViewCell

        let feedRow = userFeed[indexPath.row]
        println(feedRow.title)
        cell.mainTableViewCellTitle?.text = feedRow.title

        return cell
    }

    override func viewDidAppear(animated: Bool) {

        // Alamofire GET user/user_feed
        // Display user feed in tableview inside of uiviewcontroller

        loadUserFeed()    

    }

    func loadUserFeed(){
        println("loadUserFeed")
        let api = API()
        api.getUserFeed(){
            responseObject, error in


            var json = JSON(responseObject!)

            if error == nil{

                // get feed
                var responseFeed  = json["feed"]
                //println(json)

                for (index: String, subJson: JSON) in responseFeed {
                    var aTitle = subJson["title"].stringValue                    
                    println(aTitle)

                    // save object to array here
                    var row = UserFeedRow(title: aTitle)

                    self.userFeed.append(row) // Appending userfeed
                }

                self.mainTableView.reloadData()
            }

        }

    }
}

自定义 TableView 单元格

import Foundation
import UIKit

class MainViewTableViewCell: UITableViewCell{


    @IBOutlet weak var mainTableViewCellBackgroundImage: UIImageView!

    @IBOutlet weak var mainTableViewCellTitle: UILabel!


    override func awakeFromNib() {
        super.awakeFromNib()

    }
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

}

我会将我的评论转换为答案并附上解释。

基本上有两种处理自定义 UITableViewCell 的方法:一种是通过故事板(原型单元格)创建它们,就像您所做的那样,并且(通常)将它们分配给自定义 class;另一种是单独创建它们(使用自定义 class,或使用自定义 NIB 文件,或使用自定义 class + NIB 文件)。

在情节提要中创建单元格会在后台跳 registerClass:forCellReuseIdentifier: 舞。当您在代码中调用此方法时,它会切断情节提要单元格与您已经创建的自定义 class 之间的连接,而只是从您的自定义 class 创建单元格,在本例中包含没有视图信息,呈现为空。

额外的建议:如果您认为您可能需要一个特定的单元格而不是应用程序中的一个单元格,最好使用 NIB + class 方法创建它,然后调用registerNIB:forCellReuseIdentifier: 你想在哪里使用它。有了这个,而不是将单元格复制粘贴到您需要的任何情节提要视图中(然后如果需要更改则必须单独更改所有这些视图),您可以在整个应用程序中维护一个 view/NIB。