如何使用Swift在UITableview中加载自定义单元格(Xib)

时间:2015-02-10 13:24:04

标签: ios iphone uitableview swift xcode6

这是我的代码

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

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

    bluetoothlog.registerNib(UINib(nibName: "devicedet", bundle: nil), forCellReuseIdentifier: "discovered")
    //NSBundle.mainBundle().loadNibNamed("devicedet", owner: nil, options: nil)[0] as UITableViewCell

    cell = blucell
    devname.text = peri[indexPath.row]
    devstrength.text = signalstrength[indexPath.row]

    bluetoothlog.backgroundColor = UIColor.clearColor()
    return cell        
}

我已尝试使用上面的代码,Tableview中没有显示任何内容,请帮我修改此代码

谢谢

9 个答案:

答案 0 :(得分:4)

  1. 使用重用标识符注册NIB:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.registerNib(UINib(nibName: "devicedet", bundle: nil), forCellReuseIdentifier: "Cell")
    }
    
  2. 然后,您的cellForRowAtIndexPath将实例化该单元格。

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! devicedet
    
        return cell
    }
    

答案 1 :(得分:1)

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

    var cell :devicedet = tableView.dequeueReusableCellWithIdentifier("discovered") as UITableViewCell!

    bluetoothlog.registerNib(UINib(nibName: "devicedet", bundle: nil), forCellReuseIdentifier: "discovered")
    //NSBundle.mainBundle().loadNibNamed("devicedet", owner: nil, options: nil)[0] as UITableViewCell

    cell = blucell
    devname.text = peri[indexPath.row]
    devstrength.text = signalstrength[indexPath.row]

    bluetoothlog.backgroundColor = UIColor.clearColor()
    return cell        
}

答案 2 :(得分:1)

  • 命令registerNib应该在ViewDidLoad中调用,但不能在每次调用行的单元格中调用
  • 什么是' bluecell'?在你的回叫cellforTable ..中,你指定cell = blucell - >这可能会导致你的问题。

试试这个:

import UIKit

class YourViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

override func viewDidLoad() {
        super.viewDidLoad()

//call register nib here!!
        bluetoothlog.registerNib(UINib(nibName: "devicedet", bundle: nil), forCellReuseIdentifier: "discovered")
    }

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

//it seem that you have to add a è
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell!
{
    let cell :UITableViewCell = tableView.dequeueReusableCellWithIdentifier("discovered") as UITableViewCell!
/*  REMOVE THIS
    bluetoothlog.registerNib(UINib(nibName: "devicedet", bundle: nil), forCellReuseIdentifier: "discovered")
    //NSBundle.mainBundle().loadNibNamed("devicedet", owner: nil, options: nil)[0] as UITableViewCell
*/
  //// THEN, UPDATE YOUR CELL with YOUR DATAs

/* I don't understand what are you doing with this line of code:
    cell = blucell

*/

    devname.text = peri[indexPath.row]
    devstrength.text = signalstrength[indexPath.row]

//Seem that bluetoothlog is the tableview, you should call it in viewdidload or viewwillappear()
    bluetoothlog.backgroundColor = UIColor.clearColor()

    return cell        
}

}

答案 3 :(得分:0)

在viewDidLoad中注册XIB,如下所示

var userDetailsNIB = UINib(nibName: "UserDetailsCell", bundle: nil)
        viewListingTable.registerNib(userDetailsNIB, forCellReuseIdentifier: "UserDetailsViewCellID")

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

function use it by access it with Identifier which created in viewDidLoad method

let cell = tableView.dequeueReusableCellWithIdentifier("UserDetailsViewCellID") as UserDetailsViewCell

return cell

答案 4 :(得分:0)

如果您想在swift中的UITableView中加载自定义单元格(Xib),可以使用以下代码。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return array.count; //This function returns number of rows in table view
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:YourTableViewCell! = tableView.dequeueReusableCellWithIdentifier("YourTableViewCell", forIndexPath:indexPath)as! YourTableViewCell
   // Do additional code here
}

不要忘记在viewDidLoad

中注册nib
override func viewDidLoad() {
    super.viewDidLoad()
    // registering your nib
    let yourNibName = UINib(nibName: "YourTableViewCell", bundle: nil)
    tableView.registerNib(yourNibName, forCellReuseIdentifier: "YourTableViewCell")
    // Do any additional setup after loading the view.
}

答案 5 :(得分:0)

在Swift中注册xib Cell

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(UINib(nibName: "XibCell", bundle: nil), forCellReuseIdentifier: "Cell")
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! UITableViewCell
    return cell
}

答案 6 :(得分:0)

我的代码:

override func viewDidLoad() {
    super.viewDidLoad()
     tableView.register(
         UINib(nibName: "XibCell", bundle: nil), 
         forCellReuseIdentifier: "Cell"
     )
 }

func tableView(_ tableView: UITableView, 
               cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 
    return cell as! UITableViewCell
}

答案 7 :(得分:-1)

您的功能registerNib,您尝试在viewDidLoad()方法中编写并从cellForRowAtIndexPah中删除然后测试您的项目

您的Cell实例应该是CustomCell实例而不是UITableView Cell。 var cell:UITableViewCell应替换为 var cell:devicedet

答案 8 :(得分:-1)

import UIKit
    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    //MARK:- Sample Data Array to load in TableView
        let sampleArrray: \[String\] = \["val1", "val2", "val3", "val4", "val5"]

    //MARK:- Cell reuse identifier 
        let cellReuseIdentifier = "cell"


    //MARK:- UITableView outlet 
         @IBOutlet var tableView: UITableView!

          override func viewDidLoad() {
            super.viewDidLoad()

            // Registering the custom cell

            self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)

            // Setting delegate and Datasourse as same viewcontroller (this code is not neccessory if we are setting it from storyboard)

            tableView.delegate = self
            tableView.dataSource = self
        }
    //UITableview required methods 

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

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

            cell.textLabel?.text = sampleArrray\[indexPath.row\]

            return cell
        }

        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
           print("clicked at: \(indexPath.row)")
           //Here u can get the selected cell and add action related to this cell seelction 
        }

添加了从故事板设置数据源和委托的屏幕截图 enter image description here