2

プログラミングの初心者**

可変配列からオブジェクトにアクセスしようとすると、「境界を超えた」NSRangeException が発生します。エラーは objectAtIndex の長い数値を示していますが、配列には現在 3 つのオブジェクトしかありません。

これはエラー メッセージです: キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています

コアデータを使用しています。

コア データを介して入力されたテーブルビューの最初の行を選択すると、アプリがクラッシュします。

可変配列は「allDates」と呼ばれます。

それを引き起こしていると思われるコードは、次の prepareForSegue メソッドにあります。

DateTableViewController.m の一部

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

NSString *segueIdentifier = [segue identifier];
    if ([segueIdentifier isEqualToString:@"showDetails"])
    {
        NSManagedObjectContext *context = [self managedObjectContext];

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Date"
                                                  inManagedObjectContext:context];
        [fetchRequest setEntity:entity];


        self.allDates = [[context executeFetchRequest:fetchRequest error:nil] mutableCopy];
        DateIdeaDetailViewController *vc = [segue destinationViewController];

        NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];

         NSUInteger index = [allDates indexOfObject:selectedRowIndexPath];
        //edited based on WilliamFalcon added "(int)"
        _string = [NSMutableString stringWithFormat:@"%@", [allDates[(int)index] valueForKey:@"date_idea"]];

       vc.dateIdeaLabelText = self.string;

    }

}

DateTableViewController.h

#import <UIKit/UIKit.h>
#import "LifeBook.h"
#import "LifeBookAppDelegate.h"
#import "DateIdeaDetailViewController.h"

@interface DateTableViewController : UITableViewController 

@property (strong, nonatomic) NSMutableArray *allDates;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (weak, nonatomic) IBOutlet UITableViewCell *tableViewCell1;
@property (strong, nonatomic) NSMutableString *string;

@property (strong, nonatomic) NSString *label;


@end

これがばかげた質問であるかどうか教えてください。あらゆる種類のリソースを歓迎します。

助けてくれてありがとう

4

2 に答える 2

2

indexOfObject:戻ってきたという事実2147483647はまぐれではありません。2147483647これNSNotFoundは、指定したオブジェクトが配列内のどのインデックスにも存在しない場合、つまり「見つからない」場合NSIntegerMaxに によって返される値です。indexOfObject:

ドキュメントから

対応する配列値が anObject と等しい最小のインデックス。配列内に anObject と等しいオブジェクトがない場合は、NSNotFound を返します。

これにより、アプリがクラッシュする理由がわかります。明らかに、配列のカウントよりも 1 少ないインデックスよりも大きいインデックスで配列内の要素にアクセスすることはできず、配列のカウントより2147483647もはるかに大きい数であるため、範囲例外がスローされます。幸いなことに、この問題は簡単に解決できます。必要なのは、インデックスが配列のカウント以上の場合に配列にアクセスできないようにすることだけです。次に例を示します。

if (index < allDates.count) {
    _string = [NSMutableString stringWithFormat:@"%@", [allDates[(int)index] valueForKey:@"date_idea"]];
   vc.dateIdeaLabelText = self.string;
}else{
    // do something else..
    vs.dateIdeaLabelText = @"Something went wrong!";
}
于 2013-11-11T03:36:47.183 に答える
1

配列にインデックスパスのインデックスを要求しているようです。それがインデックスパスの配列だとは思いません...

allDates[selectedRowIndexPath.row] を実行するだけです。

また、その行を部分に分割して、デバッグを改善できるようにしてください。

于 2013-11-11T03:55:19.603 に答える