【问题标题】:BAD_ACCESS & NSInvalidArgumentException in working with UIPickerView使用 UIPickerView 时出现 BAD_ACCESS 和 NSInvalidArgumentException
【发布时间】:2013-10-27 05:46:03
【问题描述】:

我是使用 UIKit 的初学者。当我厌倦了在 iOS 7 SDK 中使用 UIPickerView 时,我遇到了一个难以解决的问题。

我们知道 UIPickerView 需要两个资源才能完美运行:dataSource 和 delegate。所以我写了一个名为“KMPickerProtocols”的类。我将它用于 UIPickerViewDataSource 和 UIPickerViewDelegate 协议,然后我添加了一些额外的 setter 方法。

dataSource和delegate Protocols的所有必要方法都采用了KMPickerProtocols + 设置每行标题的必要可选方法(pickerView:titleForRow:forComponent)。所有这些方法都可以毫无问题地完成工作(在正常情况下)。

最后,我用这段代码手动设置了我的 UIPickerView(名为 _accountPicker)的 delegate 和 dataSource 属性:

 NSArray *delegateAgent = [[KMTwitterDelegate new] run ];
_accountPicker.dataSource = [delegateAgent objectAtIndex:0];
_accountPicker.delegate = [delegateAgent objectAtIndex:1] ;

(run方法是用来设置一些属性,包括每行的高度和...)

现在,当我运行我的应用程序时,它会以 UIPickerView 的形式显示我存储在系统(帐户框架)中的 twitterAccounts。但有一个问题:只要我滚动选择器视图或点击任何行,程序就会崩溃,我在这行代码中得到 BAD_ACCESS (code=2 , address = 0x1):

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([KMAppDelegate class]));
}

而且有时我会在上面的行中收到信号 SIGABRT。在这些情况下,日志说:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSMallocBlock pickerView:titleForRow:forComponent:]:无法识别的选择器发送到实例 0x8c75ad0'

如果您能帮助我解决这个问题,我将不胜感激。我真的不知道bug在哪里。但我想这个屏幕截图将有助于发现:

上面截图的问题是 UIPicker 为第 0 行调用了“pickerView:titleForRow:forComponent”方法,调用了 3 次而不是 1 次。我只是不知道这是因为 myFault 还是因为 UIPicker 的典型行为。

【问题讨论】:

    标签: ios objective-c delegates datasource uipickerview


    【解决方案1】:

    您将消息pickerView:titleForRow:forComponent: 发送到NSMallocBlock 类型的对象。这是从选择器自动发送到其数据源的消息,所以我的假设是您正在分配数据源:

    _accountPicker.dataSource = [delegateAgent objectAtIndex:0];
    

    您分配的数据源不符合协议UIPickerViewDataSource

    检查返回 [delegateAgent objectAtIndex:0]; 的内容并确保它符合您的预期。

    【讨论】:

    • 谢谢。我已经检查过了,这正是我所期望的。并且在应用程序的第一次运行中,没有问题,但是当您使用选择器时,这些坏事就会发生。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多