2015-01-31 3 views
0

Я застрял здесь, так как два дня назад, и не могу найти, как управлять этим .. У меня есть uitableview, с массивом пользовательских ячеек и разделов, вот что я хочу сделать:swift custom uitextviewcell label всегда nil

  • Раздел 1: просто строка с ярлыком внутри
  • Раздел 2: DatePicker (я использовал класс 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», он выходит из строя говорит? «Фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение».

Я создал также файл .xib и назначил его классу cellDettagli. Я всегда получаю эту ошибку.

Как установить значения этой метки и дату строки datepicker?

Спасибо

+0

Почему вы создаете массив ячеек? – Fogmeister

+0

таблица изготовлена ​​из пользовательских ячеек, которые могут меняться во время использования приложения. Кроме того, мне может понадобиться создавать разные аналогичные таблицы в других раскадках, так же, как и – MauroMaxxa

+0

Да. Но ни один из них не является основанием для создания массива сохраненных ячеек. Вы всегда должны деактивировать ячейки, используя метод tablviews dequeue. На самом деле это то, что вы делаете в своем ответе. Кстати, ваш ответ в основном игнорирует массив ячеек, который я задавал в первую очередь. – Fogmeister

ответ

1

Вы создаете клетки с помощью назначенного Инициализатора, что означает, что мнения, которые вы добавили в бобах не будут там во время выполнения. Вам нужно будет сначала зарегистрировать свой пень с помощью tableview, используя registerNib:forCellReuseIdentifier:, а затем деактивировать ячейки, используя dequeueReusableCellWithIdentifier:forIndexPath:.

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

Так это выглядит, как вы используете статические клетки, вы могли бы быть лучше использовать раскадровку с «Static Cells» типа контента на вашем представлении таблицы вместо «Dynamic Прототипы».

Для получения дополнительной информации о статических ячейках см Документы https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/CreateConfigureTableView/CreateConfigureTableView.html

+0

Q говорит XIB, но аналогичный ответ применяется, когда NIB нужно загрузить – Wain

+0

Спасибо - я отредактировал свой ответ, чтобы отразить, что – Alex

+0

Извините, но я не могу понять смысл вашего ответа (я новичок программист, извините) так, я добавить этот self.tableView.registerNib (UINib (nibName: «cellDettagli», расслоение: NSBundle.mainBundle()), forCellReuseIdentifier: "cellStato") в viewDidLoad, перед созданием моего var cellStato в моем классе UITableViewController. , но затем, где и как удалить из этой ячейки? Извините, и спасибо за ваш ответ! – MauroMaxxa

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.

Спасибо, Александр за вашу помощь! Я уже использую статические ячейки и раскадровки ...!