swift custom uitextviewcell标签总是零

时间:2015-01-31 15:06:08

标签: ios uitableview swift null

两天前我被困在这里,无法找到如何管理这个...... 我有一个uitableview,有一系列自定义单元格和部分,这就是我想要做的事情:

  • 第1节:只是一行内有标签
  • 第2节:一个日期选择器(我为此使用了DVDatePickerTableViewCell类)

这是表格视图的代码

import UIKit

class DettagliRichiestaTVC: UITableViewController {
    //sections contiene le sezioni
    let sections: NSArray = ["Stato", "Data", "Priorità", "Richiesta", "Risposta"]
    //cells contiene tutte le righe della tabella, un 2D array
    var cells:NSArray = []
    var stato:String = "Completato"
    @IBOutlet weak var statoLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
       // statoLabel.text = stato

        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.estimatedRowHeight = 44

        // Cells is a 2D array containing sections and rows.
        var cellStato = cellDettagli(style: UITableViewCellStyle.Default, reuseIdentifier: "cellStato")
        cellStato.label?.text = "Ciao"
        cells = [
            [cellStato],
            [DVDatePickerTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)]
        ]

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func selectedStato(segue:UIStoryboardSegue) {
        let statoRichiesteTVC = segue.sourceViewController as StatoRichiesteTVC
        if let selectedStato = statoRichiesteTVC.selectedStato {
            statoLabel.text = selectedStato
            stato = selectedStato
        }
        self.navigationController?.popViewControllerAnimated(true)
    }

    // MARK: - Table view data source


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        var headerFrame:CGRect = tableView.frame


        var title = UILabel(frame: CGRectMake(10, 10, 100, 20))
        title.font = UIFont.boldSystemFontOfSize(12.0)
        title.text = self.sections.objectAtIndex(section) as? String
        title.textColor = UIColor(red: 0.6, green: 0.6, blue: 0.6, alpha: 1)

        var headerView:UIView = UIView(frame: CGRectMake(0, 0, headerFrame.size.width, headerFrame.size.height))
        headerView.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.8)
        headerView.addSubview(title)

        return headerView
    }



    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)
        if (cell.isKindOfClass(DVDatePickerTableViewCell)) {
            return (cell as DVDatePickerTableViewCell).datePickerHeight()
        }
        return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
    }


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return cells.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cells[section].count
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        return cells[indexPath.section][indexPath.row] as UITableViewCell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)
        if (cell.isKindOfClass(DVDatePickerTableViewCell)) {
            var datePickerTableViewCell = cell as DVDatePickerTableViewCell
            datePickerTableViewCell.selectedInTableView(tableView)
        }
        self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        //println(segue.identifier)
        if segue.identifier == "SavePlayerDetail" {
        }
        if segue.identifier == "SelezionaStatoRichiesta" {
            let statoRichiesteTVC = segue.destinationViewController as StatoRichiesteTVC
            statoRichiesteTVC.selectedStato = stato
        }
    }

}

这是自定义单元格类

import UIKit

class cellDettagli: UITableViewCell {
    @IBOutlet weak var label: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    func loadItem(#Label: String) {
        label.text = Label
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    required init(coder aDecoder: NSCoder) {
        //fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder)
    }


    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state
    }

}

如果我设置了cellStato.label?.text =“Ciao”​​,它会崩溃说“致命错误:在解开一个Optional值时意外地发现了nil”。

我还创建了.xib文件并将其分配给了cellDettagli类。 我总是得到那个错误。

如何设置此标签的值以及datepicker行的日期?

谢谢

2 个答案:

答案 0 :(得分:2)

我使用它做了它的工作:

var cell:cellDettagli? = tableView.dequeueReusableCellWithIdentifier("cellDettagli") as? cellDettagli
if  (cell==nil){
   var nib:NSArray=NSBundle.mainBundle().loadNibNamed("cellDettagli", owner: self, options: nil)
   cell = nib.objectAtIndex(0) as? cellDettagli
}

在我的cellForRowAtIndexPath中。

感谢亚历山大的帮助!我已经使用静态单元格和故事板......!

答案 1 :(得分:1)

您正在使用指定的初始化程序创建单元格,这意味着您在笔尖中添加的视图不会在运行时出现。您需要首先使用registerNib:forCellReuseIdentifier:向tableview注册您的笔尖,然后使用dequeueReusableCellWithIdentifier:forIndexPath:相应地将单元格出列。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/index.html

由于看起来您正在使用静态单元格,因此最好使用带有"静态单元格的故事板"表格视图上的内容类型而不是"动态原型"。

有关静态单元格的详细信息,请参阅文档https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/CreateConfigureTableView/CreateConfigureTableView.html