Swift-app 在 UITableView 中选择行时崩溃

Posted

技术标签:

【中文标题】Swift-app 在 UITableView 中选择行时崩溃【英文标题】:Swift-app crashes on row selection in 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 文件中的对象。也许最好从视图控制器手动设置它们。 【参考方案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 断开连接。这种方法也适用于我。 抱歉 - 我的完整应用程序有两个表格视图,其中有单独的服务对象作为数据源/委托。所以我每个都有一个对象,因此是复数。只要这种方法有效 - 我会保持原样。

以上是关于Swift-app 在 UITableView 中选择行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如果 UITableView 在 UIScrollView 中,则无法在 UITableView 上执行滑动删除

如何在没有数组的 UITableView 中显示 UITableView Cell?

在 Scrollview 中适配 UITableview

保持 uisearchbar 在 uitableview 中始终可见

调整 UITableView 高度(嵌入在 UIScrollView 中)

iOS UITableView删除组中唯一行,即[UITableView _endCellAnimationsWithContext:] warning