外部类中的UITableView委托和数据源不起作用

时间:2016-09-21 08:16:02

标签: ios swift uitableview

我有一个简单的项目,UITableView被添加为当前视图的子视图,外部tableviewcontroller类创建了委托和数据源。

问题是所有工作正常除了委托didSelectedRowAtIndexPath,当我单击一行时,所有tableview变为白色,这里是代码:

主要课程:

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    let cont:Tbcontroller = Tbcontroller()
    let tableViewInner = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width-(self.view.frame.width/6), height: 180))
    tableViewInner.scrollEnabled = false
    tableViewInner.separatorStyle = .None
    tableViewInner.allowsSelection = true
    tableViewInner.userInteractionEnabled = true
    cont.type = 1
    cont.setCurrentTableView(tableViewInner)
    self.view.insertSubview(tableViewInner, atIndex: self.view.subviews.count+1)

}

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


}

EXTERNAL CLASS DELEGATE DATASOURCE:

import UIKit

class Tbcontroller: UITableViewController {

var type:Int = 1

override func viewDidLoad() {
    super.viewDidLoad()


}

func getCell() -> UITableViewCell{
    let presentCell: UITableViewCell = UITableViewCell()
    return presentCell

}

func setCurrentTableView(table:UITableView){

    self.tableView = table
    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.reloadData()
}

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 4
}

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

    let cell = getCell()
    cell.textLabel?.text = "ciao"
    cell.textLabel?.font = UIFont.systemFontOfSize(13)

    return cell

}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    return 100

}

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

    print("clicked")

}

}

当我点击时,我看不到输出“点击”

2 个答案:

答案 0 :(得分:1)

你的主要问题是TbController()被取消分配。 UITableView上的dataSourcedelegate属性很弱。因此,因为您只将TbController分配给局部变量和弱属性,所以它将被释放。

此外,UITableViewController已经为您创建了一个TableView。 “重新创造”它并不是一种好习惯。我宁愿在UITableViewController中使用TableView,并将UITableViewController的视图作为子视图添加到UIViewController的视图中。

要修复,你需要一个TbController的实例变量。

使用ivar for TbController并使用Tbcontroller的UITableView的示例代码。

 import UIKit

    class ViewController: UIViewController {

    var cont: Tbcontroller = Tbcontroller()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        cont.type = 1
        self.view.addSubview(cont.view)
    }

}

    import UIKit

    class Tbcontroller: UITableViewController {

    var type:Int = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.scrollEnabled = false
        tableView.separatorStyle = .None
        tableView.allowsSelection = true
        tableView.userInteractionEnabled = true

        self.tableView.delegate = self
        self.tableView.dataSource = self
    }

    func getCell() -> UITableViewCell{
        let presentCell: UITableViewCell = UITableViewCell()
        return presentCell

    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 4
    }

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

        let cell = getCell()
        cell.textLabel?.text = "ciao"
        cell.textLabel?.font = UIFont.systemFontOfSize(13)

        return cell

    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        return 100

    }

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

        print("clicked")

    }

}

答案 1 :(得分:1)

感谢Carien,它工作正常,我改变了uitableviewcontroller:

: NSObject, UITableViewDataSource, UITableViewDelegate