在框架提供的视图控制器上重写 didSelectRowAtIndexPath?

Overriding didSelectRowAtIndexPath on a framework-provided view controller?

所以我使用 CoreAudioKit 的 CABTMIDICentralViewController 为用户提供 MIDI 蓝牙设备列表 select。但是,我希望能够告诉用户 select 完成后使用的是哪个设备,但 Apple 似乎没有添加任何方法来做到这一点。

所以我试图通过检测用户 select 在 table:

中的一行来破解它

DPBleMidiDeviceManager.h:

#import <CoreAudioKit/CoreAudioKit.h>

@interface DPBleMidiDeviceManager : CABTMIDICentralViewController

@end

DPBleMidiDeviceManager.m:

#import "DPBleMidiDeviceManager.h"

@implementation DPBleMidiDeviceManager

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"midi device selected %@", indexPath);

    //either of these next lines crash, it makes no difference:
    //[[tableView delegate] tableView:tableView didDeselectRowAtIndexPath:indexPath];
    [super tableView:tableView didDeselectRowAtIndexPath:indexPath];
}
@end

问题是,它在最后一行崩溃,说没有 selector。这很奇怪,因为如果我删除 super 调用,它不会崩溃,但它也不会正确连接到 BLE 设备,就像我没有覆盖该委托调用时一样。

这只是 Apple 所做的让您无法访问他们的 table 的事情吗?为什么他们会构建一个这样的 UI 视图并让您调用它,但不向您提供有关结果的任何信息?我是否缺少执行此操作的一些标准方法?

编辑:以下是 super 调用崩溃的详细信息:

2015-10-29 15:14:37.039 [626:338267] midi device selected <NSIndexPath: 0x1473ae20> {length = 2, path = 0 - 3}
2015-10-29 15:14:37.039 [626:338267] -[DPBleMidiDeviceManager tableView:didDeselectRowAtIndexPath:]: unrecognized selector sent to instance 0x147f34e0
2015-10-29 15:14:37.040 [626:338267] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DPBleMidiDeviceManager tableView:didDeselectRowAtIndexPath:]: unrecognized selector sent to instance 0x147f34e0'
*** First throw call stack:
(0x2b3cdfef 0x3967dc8b 0x2b3d3409 0x2b3d11bf 0x2b300e78 0xaa165 0x2eb3956b 0x2ebe843b 0x2ea9da91 0x2ea1838f 0x2b393fed 0x2b3916ab 0x2b391ab3 0x2b2de201 0x2b2de013 0x32aab201 0x2ea82a59 0x88447 0x39c09aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

这不是你所说的超级。应该是

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"midi device selected %@", indexPath);

    [super tableView:tableView didDeselectRowAtIndexPath:indexPath];
}