我遇到了一个奇怪的问题。我正在尝试以编程方式将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。
答案 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
返回后立即取消分配。您必须保留对数据源的引用。