如何以编程方式设置UITableView的dataSource?

sin*_*ina 1 xcode uitableview ios swift

我有一个奇怪的问题.我试图以编程方式将dataSource分配给表.

UITableView使用Interface Builder在ViewController中为它创建了一个和一个IBOutlet.我创建了一个实现的类UITableViewDataSource.我将dataSource我的表设置为dataSource的一个实例.Everything编译并运行正常,直到设置dataSource的行在运行时执行.

错误是,Thread 1: EXC_BAD_ACCESS (code=EXC_i386_GPFLT)class AppDelegate突出显示定义行.

class ViewController: UIViewController {

    @IBOutlet weak var table: UITableView!

    override func viewDidLoad() {
        let ds = MyData()
        table.dataSource = ds // <---- Runtime error
        table.reloadData()
        super.viewDidLoad()
    }
    // ... other methods
}


class MyData: NSObject, UITableViewDataSource {
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let cell = UITableViewCell()
        cell.textLabel.text = "a row"
        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法为什么我得到这个运行时错误?我正在使用Swift的XCode 6 beta 4.

Raf*_*fAl 14

将您的代码更改为:

class ViewController: UIViewController 
{
    @IBOutlet weak var table: UITableView!
    var dataSource: MyData?

    override func viewDidLoad() 
    {
        super.viewDidLoad()

        dataSource = MyData()
        table.dataSource = dataSource!
    }
}
Run Code Online (Sandbox Code Playgroud)

您的应用程序会中断,因为ds一旦viewDidLoad返回就会释放.您必须保留对数据源的引用.