【问题标题】:How can I programmatically set dataSource of UITableView?如何以编程方式设置 UITableView 的数据源?
【发布时间】:2014-08-01 08:07:16
【问题描述】:

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

我使用 Interface Builder 在我的 ViewController 中为它创建了一个 UITableView 和一个 IBOutlet。我创建了一个实现UITableViewDataSource 的类。我将表的dataSource 设置为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 一起使用。

【问题讨论】:

  • 你遇到了什么错误?
  • dataSource 委托通常是一个 weak 属性,并且您不会使用范围之外的强指针保持您的 ds 活动,因此当@987654330 时会立即释放@ 超出了自己的范围...这可能会导致您的问题。
  • @holex 我的想法完全一样。解决方法是移行:let ds = MyData() out of the viewDidLoad, IBOutlet weak var table:UItableView
  • @Greg 我添加了错误消息。
  • 感谢@holex 和@Greg。是的,这就是原因。那么,说我们通过引用而不是值设置table.dataSource 是否有意义?如果它是按值设置的,代码会起作用吗?

标签: ios xcode uitableview swift


【解决方案1】:

将您的代码更改为:

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

    override func viewDidLoad() 
    {
        super.viewDidLoad()

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

您的应用程序中断,因为dsviewDidLoad 返回后立即被释放。您必须保留对数据源的引用。

【讨论】:

  • 拯救了我的一天。有什么特殊原因说明它只有在您将其声明为全局变量时才有效?
  • @user431791 UITableView 的数据源很弱,所以在某处必须有一个强引用,在这种情况下是类变量
  • 很有意义@SteveKuo
  • @user431791 有点晚了,也许你现在明白了,但这不是一个全局变量。这是一个实例变量。
猜你喜欢
  • 2011-03-23
  • 2010-12-10
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2023-04-02
  • 2011-09-24
相关资源
最近更新 更多