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

时间:2014-08-01 08:07:17

标签: ios xcode uitableview swift

我遇到了一个奇怪的问题。我正在尝试以编程方式将dataSource分配给表。

我使用Interface Builder在ViewController中为它创建了一个UITableView和一个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
    }
}

为什么我收到此运行时错误的任何想法?我正在使用XCode 6 beta 4和Swift。

1 个答案:

答案 0 :(得分:14)

将您的代码更改为:

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

    override func viewDidLoad() 
    {
        super.viewDidLoad()

        dataSource = MyData()
        table.dataSource = dataSource!
    }
}

您的应用会中断,因为ds会在viewDidLoad返回后立即取消分配。您必须保留对数据源的引用。