2016-09-21 80 views
1

我有一个简单的项目,UITableView作为当前视图的子视图添加,外部tableviewcontroller类,使委托和数据源。UITableView委托和外部类中的数据源不起作用

的问题是,所有工作正常除外委托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. 
} 


} 

外部类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") 

} 

} 

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

回答

0

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

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

要修复,您需要TbController的实例变量。

使用ivar替代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

感谢Carien,它工作得很好,我改变了的UITableViewController有:

: NSObject, UITableViewDataSource, UITableViewDelegate 
相关问题