2

私のアプリケーションでは、URLからコンテンツをロードし、それらを可変配列に格納して、テーブルビューに表示しようとしています。しかし、アプリを実行するたびにこのエラーが表示されるため、動作させることができません。

*** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(0x34dd088f 0x36d9e259 0x34d2823d 0x316e562f 0x315f09a9 0x313c0c5d 0x313c1b95 0x313c1ae7
 0x313c16c3 0xa5cfb 0x33623ec7 0x35387a09 0x35390051 0x33622965 0xa4dc1 0x313a8e33 
 0x313cd629 0x31391d7d 0x314544dd 0x3139a55d 0x3139a579 0x3139a40b 0x3139a3e7 0x313a8015 
 0x313a1985 0x3136fc6b 0x3136f70f 0x3136f0e3 0x3439222b 0x34da4523 0x34da44c5 0x34da3313 
 0x34d264a5 0x34d2636d 0x313a0a13 0x3139de7d 0xa4745 0xa46dc)
terminate called throwing an exception

viewDidLoadのテーブルに次のように入力する配列を作成します。

_videos = [[NSMutableArray alloc] init];

次に、URLに接続し、受信したxmlデータを解析します。これは正常に機能します。特定のタグが開かれると、ビデオオブジェクトを作成し、それらにデータを入力した後、それらのオブジェクトを次のように配列に追加します。

[_videos addObject:currentVideo];

これは、次の場合に正しい数のビデオを返すため、同様に機能するようです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return _videos.count;
}

と呼ばれます。しかし、この時点以降、アプリがクラッシュし、テーブルビューにデータを入力しようとするポイントに到達しません。関数は次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    Video *curVideo = [_videos objectAtIndex:indexPath.row];

    static NSString *CellIdentifier = @"CustomCell";

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)        
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    cell.titleLabel.text = [curVideo title];
    cell.descLabel.text = [curVideo desc];

    return cell;
}

何が悪いのですか?

前もって感謝します

4

3 に答える 3

5

-[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 .. 1]'2 つの (5 つから更新された) 静的テーブル セル セクションを含むモーダル ストーリーボード、テーブル ビューを表示しようとすると、同じエラー シグネチャが発生しました。このエラーは、ビューで不要になった 3 つのテーブル セル セクションを削除するまで発生しませんでした。モーダル プレゼンテーションに先立つすべての objectAtIndex 参照を 2 日間にわたって詳しく調べた後、UITableViewController サブクラス コード自体を確認することにしました。私はこれを見つけました:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 5;
}

すると電球が消えた。テーブル ビューのセクション数に関連する参照と、現在の 2 つのテーブル セル セクションindex 4の参照の境界。ストーリーボード テーブル ビューの現在のテーブル セル セクションの数と一致するように値を[0 .. 1]更新すると、問題が解決しました。return

于 2013-07-03T22:56:01.423 に答える
4

_videos初期化する前にアクセスしている可能性が高い場所。ほとんどの場合、 の後init、ビューをロードする前に実行します。この種の問題の修正は、アクセサーを排他的に使用し、遅延初期化することself.videosです。initこれは、および以外で ivar に直接アクセスしない多くの理由の 1 つですdealloc

@interface ...
@property (nonatomic, readonly, strong) NSMutableArray *videos;
@end

@implementation ...
{
  NSMutableArray *_videos; // Can't auto-synthesize. We override the only accessor.
}

- (NSMutableArray *)videos {
   if (! _videos) {
     _videos = [NSMutableArray new];
   }
   return _videos;
}

へのすべての参照self.videosは、いつ発生しても初期化されます。

でビデオを正しく初期化することもできますinit。これにより、必要なコードが少し少なくなります。

@interface ...
@property (nonatomic, readonly, strong) NSMutableArray *videos;
@end

@implementation ...

- (id)init {
   self = [super init];
   if (self) {
     _videos = [NSMutableArray new];
   }
   return self;
}
于 2012-09-28T13:41:44.587 に答える