【问题标题】:Swift-app crashes on row selection in UITableViewSwift-app 在 UITableView 中选择行时崩溃
【发布时间】:2015-05-04 20:15:43
【问题描述】:

我在使用 Swift 中的 UITableView 时遇到问题。 只要我不实现处理单元格选择的委托函数,它就可以正常工作。

这是我非常简单的类,它充当表视图委托和数据源:

import UIKit

class TableViewService : NSObject, UITableViewDataSource, UITableViewDelegate {

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell()

    if(indexPath.row == 0) {
        cell.textLabel?.text = "One"
    } else {
        cell.textLabel?.text = "Two"
    }

    cell.selectionStyle = .None

    return cell;
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    log.debug("Row selceted")
}
}

只要我在表视图中选择一行,应用程序就会崩溃,并在 objc_msgSend 中出现 EXEC_BAD_ACCESS 错误 - 控制台中没有记录任何错误,如果我在 didSelectRowAtIndexPath 函数上设置断点,它永远不会被触发。

任何想法我错过了什么或做错了什么?

【问题讨论】:

  • 想显示视图控制器的代码,你的 tableview 是在哪里实现的?
  • 什么是log,你为那个类初始化了吗?
  • @RoryMcKinnel - 日志实例是一个全局 XCLogger。但在这种情况下它不相关。我在 didSelectRowAtIndexPath 函数中输入了什么代码并不重要 - 它仍然会崩溃。
  • @AndreSlotta - 我的 ViewController 基本上只加载一个包含表格视图的 NIB 文件。我已将委托和数据源设置为 NIB 文件中的对象。也许最好从视图控制器手动设置它们。

标签: ios uitableview swift


【解决方案1】:

以下是我为顺利创建您的项目所采取的步骤。如果你在某个地方错过了一步,也许它会有所帮助?:

1) 在storyboard中设置UITableView作为ViewController的子视图

2) 将代码添加到ViewController(您的自定义类)

class ViewController: UIViewController {

    @IBOutlet var tableView:UITableView!
    let tableService:TableViewService = TableViewService()

     override func viewDidLoad() {
         super.viewDidLoad()
         tableView.delegate = tableService
         tableView.dataSource = tableService
    }
}

3) 确保插座在ViewControllertableView 之间连接

4) TableViewService 类是从您上面的代码中复制/粘贴的(除了我使用println() 而不是log.debug

如果我确定了这三件事,那么我可以看到委托方法被调用而没有崩溃。

【讨论】:

  • 我已将委托和数据源设置为 NIB 文件中的对象。也许最好从视图控制器手动设置它们 - 我会尝试这种方法。
  • 在代码中设置数据源和委托时有效。我想这适合我懒惰并在 Interface Builder 中做这件事。 :)
  • 很高兴我上面的方法对你来说很好:) 虽然我很好奇你的意思是你将它们设置为“对象” - 复数。您应该能够将单个对象添加到您的NIB,确保它是正确的类TableViewService,将tableViewdelegatedataSource 直接连接到该对象。确保它们与ViewController 断开连接。这种方法也适用于我。
  • 抱歉 - 我的完整应用程序有两个表格视图,其中有单独的服务对象作为数据源/委托。所以我每个都有一个对象,因此是复数。只要这种方法有效 - 我会保持原样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 2021-01-17
  • 2015-06-13
相关资源
最近更新 更多