为 UITableView 自定义详细信息披露按钮配置操作 [英] Configuring action for UITableView custom detail disclosure button

查看:26
本文介绍了为 UITableView 自定义详细信息披露按钮配置操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 UIViewController 中有一个 UITableView.在我的tableView(_:cellForRowAt:中,我配置了一个带有自定义detailDisclosure按钮的单元格,如下:

I have a UITableView inside of a UIViewController. In my tableView(_:cellForRowAt:, I configured a cell with a custom detailDisclosure button, as follows:

cell.accessoryType = .detailDisclosureButton

我还实现了 tableView(_:accessoryButtonTappedForRowWith:).使用工厂"detailDisclosureButton 效果很好.我不关心图标,所以我试图改变它.

I've also implemented tableView(_:accessoryButtonTappedForRowWith:). Using the "factory" detailDisclosureButton works perfectly. I don't care for the icon, so I sought to change it.

设置cell.accessoryType后,添加如下代码:

After setting the cell.accessoryType, I added the following code:

// declare the button
let customDetailDisclosureButton = UIButton.init(type: .detailDisclosure)

// set the image for .normal and .selected
customDetailDisclosureButton.setImage(UIImage(named: "info")?.withRenderingMode(.alwaysTemplate), for: .normal)
customDetailDisclosureButton.setImage(UIImage(named: "info")?.withRenderingMode(.alwaysTemplate), for: .selected)

// add a target action
customDetailDisclosureButton.addTarget(self, action: #selector(tableView(_:accessoryButtonTappedForRowWith:)), for: .touchUpInside)

cell.accessoryView = customDetailDisclosureButton

当我加载 tableView 时,它显示正常.当我点击 detailDisclosureButton 时,它崩溃了.我做错了什么?

When I load the tableView, it displays fine. When I tap the detailDisclosureButton, it crashes. What am I doing wrong?

这是控制台输出:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITouchesEvent length]: unrecognized selector sent to instance 0x6180000f1000'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000102e9ab0b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00000001024ea141 objc_exception_throw + 48
    2   CoreFoundation                      0x0000000102f0a134 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x0000000102e21840 ___forwarding___ + 1024
    4   CoreFoundation                      0x0000000102e213b8 _CF_forwarding_prep_0 + 120
    5   libswiftFoundation.dylib            0x000000010425c1a0 _TTSf4g_d___TFV10Foundation9IndexPathCfT11nsIndexPathCSo11NSIndexPath_S0_ + 32
    6   libswiftFoundation.dylib            0x0000000104210a57 _TZFV10Foundation9IndexPath36_unconditionallyBridgeFromObjectiveCfGSqCSo11NSIndexPath_S0_ + 23
    7   MyApp                          0x0000000101e43ae7 _TToFC10MyApp22PlaylistViewController9tableViewfTCSo11UITableView31accessoryButtonTappedForRowWithV10Foundation9IndexPath_T_ + 71
    8   UIKit                               0x0000000104f17d22 -[UIApplication sendAction:to:from:forEvent:] + 83
    9   UIKit                               0x000000010509c25c -[UIControl sendAction:to:forEvent:] + 67
    10  UIKit                               0x000000010509c577 -[UIControl _sendActionsForEvents:withEvent:] + 450
    11  UIKit                               0x000000010509b4b2 -[UIControl touchesEnded:withEvent:] + 618
    12  UIKit                               0x0000000105440ea9 _UIGestureEnvironmentSortAndSendDelayedTouches + 5553
    13  UIKit                               0x000000010543bec0 _UIGestureEnvironmentUpdate + 1409
    14  UIKit                               0x000000010543b8f3 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 484
    15  UIKit                               0x000000010543aaba -[UIGestureEnvironment _updateGesturesForEvent:window:] + 274
    16  UIKit                               0x0000000104f86b9a -[UIWindow sendEvent:] + 4092
    17  UIKit                               0x0000000104f337b0 -[UIApplication sendEvent:] + 352
    18  UIKit                               0x0000000105716adc __dispatchPreprocessedEventFromEventQueue + 2926
    19  UIKit                               0x000000010570ea3a __handleEventQueue + 1122
    20  CoreFoundation                      0x0000000102e40c01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    21  CoreFoundation                      0x0000000102e260cf __CFRunLoopDoSources0 + 527
    22  CoreFoundation                      0x0000000102e255ff __CFRunLoopRun + 911
    23  CoreFoundation                      0x0000000102e25016 CFRunLoopRunSpecific + 406
    24  GraphicsServices                    0x0000000108d83a24 GSEventRunModal + 62
    25  UIKit                               0x0000000104f160d4 UIApplicationMain + 159
    26  MyApp                          0x0000000101e4df47 main + 55
    27  libdyld.dylib                       0x0000000104dfa65d start + 1
    28  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of 

推荐答案

替换

// add a target action
customDetailDisclosureButton.addTarget(self, action: #selector(tableView(_:accessoryButtonTappedForRowWith:)), for: .touchUpInside)

customDetailDisclosureButton.addTarget(self, action: #selector(ViewController.accessoryButtonTapped(sender:)), for: .touchUpInside)

然后

func accessoryButtonTapped(sender : UIButton){
        let buttonPosition: CGPoint = (sender as! UIButton).convert(.zero, to: tableView)
        let indexPath = tableView.indexPathForRow(at: buttonPosition)
        // do what you gotta do with the indexPath
    }

这篇关于为 UITableView 自定义详细信息披露按钮配置操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆