2015-10-19 82 views
1

我目前正在以編程方式學習Swift。我想將tableView添加到viewController(爲了能夠稍後操作約束)並使用TableViewCell自定義單元格。TableView中的空單元格與自定義TableViewCell - Swift

當我使用storyboard時,我可以閉上眼睛,但是當我試圖用直接代碼來做到這一點時,我有空單元。

我的故事板是由一(1)具有自定義類的ViewController

我已經看過其他類似的問題,但解決方案的非工作過空viewController。想知道我忽略了什麼(可能是簡單的事情)。先謝謝您的幫助!

ViewController.swift:

import UIKit 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ 
var tableView: UITableView = UITableView() 
var items: [String] = ["Viper", "X", "Games"] 

override func viewDidLoad() { 

    tableView.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height) 
    tableView.delegate = self 
    tableView.dataSource = self 

    tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell") 

    self.view.addSubview(tableView) 
} 

func tableView(tableView:UITableView, heightForRowAtIndexPath indexPath:NSIndexPath)->CGFloat 
{ 
    return 50 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.items.count 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 3 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 

    //cell.textLabel?.text = self.items[indexPath.row] 
    cell.companyName.text = "name" 

    return cell 
} 

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

TableViewCell:

import UIKit 

class TableViewCell: UITableViewCell { 

var companyName = UILabel() 

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

    companyName.frame = CGRectMake(0, 0, 200, 20) 

    companyName.translatesAutoresizingMaskIntoConstraints = false 

    contentView.addSubview(companyName) 
} 

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

    // Configure the view for the selected state 
} 

} 

回答

3

你好@邁克爾的第一件事是,你應該只使用awakeFromNib時您正在使用的.xib(NIB)和你的情況,你正在使用自定義類沒有這樣的廈門國際銀行是這樣,你應該使用

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

    companyName = UILabel(frame: CGRectMake(0, 0, 200, 20)) 
    contentView.addSubview(companyName) 

} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

你也應該在使用它之前初始化你的標籤。 這將解決您的問題。

閱讀蘋果的UITableViewCell的子類文檔here

+0

謝謝!這是我在被@replman指向正確方向之後得到的結果。 「使用前初始化您的標籤」意味着什麼。它已初始化。 – Geppelt

+0

你只是設置了UILabel的框架,因爲在你添加到任何視圖之前,你還沒有爲你的單元格創建xib,所以最好這樣做,所以你最終不會得到零對象。還應該在cell類中實現prepareForReuse方法,以便在下次使用該對象之前進行清理。 –

+0

我不想要一個xib文件,我不明白你的意思; UIImageView被聲明,構建並添加。我不是經驗和問題的零對象。 – Geppelt

1

如果你想要廈門國際銀行這樣做有時會像你的自定義單元格,從一些自定義加載:

tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "CustomTableViewCell") 

如果您還有CustomTableViewCell.xib文件,你必須表視圖細胞重用標識符CustomTableViewCell

+0

是的,但正如我所說我正在編程。所以我已經註冊了課程。 – Geppelt

+0

幫助我,謝謝。有關此方法的文章:https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722 – comm1x

0

結帳您單元的companyLabel的佈局方式。它存在還是不存在?

在您的代碼中,我將companyLabel替換爲默認值textLabel,它適用於我。

cell.textLabel!.text = self.items[indexPath.row] 
+0

這是單元格的「默認」textLabel(對齊的中心Y )。我的標籤「companyName」位於0,0,因此如果它出現,它將被放在左上角。 我想弄清楚爲了添加更多的項目到TableViewCell。 – Geppelt

+0

這裏的想法是 - 你的表格視圖沒有任何問題。如果默認的單元格文本標籤出現,那麼您的調試範圍將縮小到自定義單元格。祝你好運! – Abhinav

0

我覺得awakeFromNib沒有被調用,因爲你沒有註冊一個筆尖,而是一個類。試試這個:

class TableViewCell: UITableViewCell { 
    let companyName = UILabel() 

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

     // Initialization code 
     companyName.frame = CGRectMake(0, 0, 200, 20) 
     companyName.translatesAutoresizingMaskIntoConstraints = false 
     contentView.addSubview(companyName) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 
+0

那將是什麼樣子? – Geppelt

+0

類似這樣的: 'override init(style:UITableViewCellStyle,reuseIdentifier:String?){ super.init(style:style,reuseIdentifier:reuseIdentifier) }' – Geppelt

+0

這樣做的竅門!感謝支持@replman – Geppelt

相關問題