在iOS 6.1中工作的UIPickerView现在在Xcode 5中崩溃
我为iOS 6开发了一个叫做UIPickerView的应用程序。现在我升级到了Xcode 5,该应用程序在iOS 7上运行良好,但在iOS 6上不再运行 应用程序在转到pickerview时崩溃。pickerview有1个组件和10行 头文件如下所示:在iOS 6.1中工作的UIPickerView现在在Xcode 5中崩溃,ios,iphone,objective-c,uipickerview,Ios,Iphone,Objective C,Uipickerview,我为iOS 6开发了一个叫做UIPickerView的应用程序。现在我升级到了Xcode 5,该应用程序在iOS 7上运行良好,但在iOS 6上不再运行 应用程序在转到pickerview时崩溃。pickerview有1个组件和10行 头文件如下所示: #import <UIKit/UIKit.h> #import "ViewController.h" @interface DxChooserViewController : UIViewController <UIPicke
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface DxChooserViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
@property (weak, nonatomic) id delegate;
@property (weak, nonatomic) IBOutlet UIPickerView *ptDxPicker;
- (IBAction)dismissDxChooser:(id)sender;
@end
更新: 问题已经解决,但下面是崩溃的原因: 2013-12-14 10:47:54.518 Pap读取器[48513:907]***由于未捕获的异常“NSRangeException”而终止应用程序,原因:“***-[NSMutableIndexSet AddIndexInRange::]:范围{2147483647,1}超过NSNotFound-1的最大索引值”
崩溃的一个可能原因是在数组中未成功找到所需的
chosenDxString
(即,您应该检查以确保chosenDxInt
未返回NSNotFound
)。您也不会检查以确保chosenDxString
不是nil
因此,您可以替换:
int chosenDxInt = 0;
if ([chosenDxString isEqualToString:@""]) {
chosenDxInt = 0;
} else {
chosenDxInt = [_dxNames indexOfObject:(chosenDxString)];
}
与:
您还有一个以编程方式定义的值数组,但是您没有向我们展示指定picker视图的委托/数据源并检索这些值的代码。因此,我假设您已经设置了picker视图的datasource/delegate属性,并实现了如下方法:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [self.dxNames count];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return self.dxNames[row];
}
就您案例中的具体问题而言,您必须使用崩溃的详细信息(崩溃的详细信息,在哪一行崩溃)更新您的问题。如果不清楚您在哪一行崩溃(即,它只是隐晦地引用了您的
main
函数),您可能还想打开它,以便在崩溃时突出显示有问题的代码行。一个可能的崩溃源是,如果在数组中未成功找到所需的chosenDxString
(即,您应该检查以确保chosenDxInt
没有返回NSNotFound
)。您也不需要检查以确保chosenDxString
不是nil
因此,您可以替换:
int chosenDxInt = 0;
if ([chosenDxString isEqualToString:@""]) {
chosenDxInt = 0;
} else {
chosenDxInt = [_dxNames indexOfObject:(chosenDxString)];
}
与:
您还有一个以编程方式定义的值数组,但您没有向我们展示指定picker视图的委托/数据源并检索这些值的代码。因此,我假定您已经设置了picker视图的数据源/委托属性,并实现了如下方法:
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [self.dxNames count];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return self.dxNames[row];
}
就您案例中的具体问题而言,您必须用崩溃的详细信息(崩溃的详细信息,在哪一行崩溃)更新您的问题。如果不清楚您在哪一行崩溃(即,它只是隐晦地指您的
main
函数),您可能还想打开,以便在崩溃时突出显示出错的代码行。非常感谢!!您的回答解决了问题,尽管我忘记了向您提供有关崩溃的详细信息。您的回答提醒我,我忘记了我需要检查chosenDxString是否为零,而不仅仅是@""。我添加了该条件,它成功了!@user3102735是的,您提供的错误消息告诉您,indexOfObject
返回了NSNotFound
。很高兴您解决了问题!非常感谢!!您的回复解决了问题,尽管我忘记了向您提供有关崩溃的详细信息。您的回复提醒了我告诉我我忘记了我需要检查chosenDxString是否为零,而不仅仅是@”。我添加了那个条件,它成功了!@user3102735是的,你提供的错误消息告诉你,indexOfObject
返回了NSNotFound
。很高兴你解决了这个问题!很抱歉我忘了这么做。问题已经解决了,但下面是崩溃的原因:2013-12-14 10:47:54.518 Pap Reader[48513:907]***由于未捕获的异常“NSRangeException”而终止应用程序,原因:'***-[NSMutableIndexSet AddIndexInsRange:]:范围{2147483647,1}超过了NSNotFound的最大索引值-1'抱歉,我忘了这么做。问题已解决,但崩溃原因如下:2013-12-14 10:47:54.518 Pap Reader[48513:907]***由于未捕获的异常“NSRangeException”而终止应用程序,原因:'***-[NSMutableIndexSet AddIndexInsRange:]:范围{2147483647,1}超过了NSNotFound-1的最大索引值'