当调试器说不是时,为什么文本标签为空? Swift app?

时间:2015-03-28 23:40:54

标签: ios swift alamofire swifty-json

我是swift的新手,我正试图让我的文字标签显示在我的桌面视图上,但它只是没有显示出来。以下是我的文件,它确实成功构建。

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

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

我提前感谢您的帮助!

当我删除self.mainTableView.reloadData()时,不会显示任何单元格。 此时,我仍然可以点击单元格,然后他们会回复以下调试器行:

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

enter image description here

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)

    }

}

1 个答案:

答案 0 :(得分:1)

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

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

在故事板中创建单元格会使registerClass:forCellReuseIdentifier:在后​​台跳舞。当您在代码中调用此方法时,它会切断storyboard单元格与您已创建的自定义类之间的连接,而只是从您的自定义类创建单元格,在这种情况下,该单元格不包含任何视图信息,并呈现为空。

另外一条忠告:如果您认为您可能需要更多地方的特定单元格,而不是您的应用程序中的某个单元格,那么使用NIB +类方法创建它可能会更好,并调用registerNIB:forCellReuseIdentifier:你想用它。有了这个,而不是在您需要的任何故事板视图中复制粘贴单元格(如果需要更改,则必须单独更改所有这些),您可以在整个应用程序中维护单个视图/ NIB。