2

UICollectionView (およびデリゲート、データ ソース、フロー レイアウト デリゲート) を実装するビュー コントローラーがあります。次の方法でスクロールビューに表示します。

   UIViewController *playlistController = [[TNSPlaylistsController alloc] initWithNibName:@"TNSPlaylistsController" bundle:nil];
   [self.scrollView addSubview:playlistController.view];

TNSPlaylistsController.h:

#import <UIKit/UIKit.h>

@interface TNSPlaylistsController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@end

TNSPlaylistsController.m:

#import "TNSPlaylistsController.h"

@interface TNSPlaylistsController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> // tried removing these on the m too

@end

@implementation TNSPlaylistsController
@synthesize musicStructure = _musicStructure, collectionView = _collectionView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return [self.musicStructure count];
}


- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellData = [self.musicStructure objectAtIndex:indexPath.row];

    static NSString *cellIdentifier = @"cvCell";

    UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    UILabel *titleLabel = (UILabel *)[cell viewWithTag:100];

    [titleLabel setText:cellData];

    return cell;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.musicStructure = [[NSArray alloc] initWithObjects:@"aaa",@"aaa",@"aaa",@"aaa",@"aaa",@"aaa", nil];


    UINib *cellNib = [UINib nibWithNibName:@"TNSPlaylistCell" bundle:nil];
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cvCell"];

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
    [flowLayout setItemSize:CGSizeMake(100, 100)];
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

    [self.collectionView setCollectionViewLayout:flowLayout];

    NSLog(@"%@\n%@\n%@\n%@\n%@", self, self.musicStructure, self.collectionView, flowLayout, cellNib);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

XIB には、実装ファイルに接続された UICollectionView が含まれています。

問題は、アプリの起動時に個別に EXC_BAD_ACCESS または NSInvalidArgumentException が発生することです (ビュー コントローラーはアプリの最初のビューに読み込まれます)。View Controllerを通常のモーダルビューとして表示すると、正常に動作します

NSInvalidArgumentExceptionトレース:

2012-10-27 15:32:47.144 Tunes[19255:c07] -[NSConcreteMapTable collectionView:numberOfItemsInSection:]: unrecognized selector sent to instance 0x76524c0
2012-10-27 15:32:47.146 Tunes[19255:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable collectionView:numberOfItemsInSection:]: unrecognized selector sent to instance 0x76524c0'
*** First throw call stack:
(0x1598012 0x12a5e7e 0x16234bd 0x1587bbc 0x158794e 0x71b25f 0x71b2fa 0x71cbb4 0x6f4f14 0x70ab14 0x70b72b 0x707aea 0x71b38a 0x71b9cb 0x6f3273 0x23d92d 0x12b96b0 0x107fc0 0xfc33c 0x107eaf 0x2dc8cd 0x2251a6 0x223cbf 0x223bd9 0x222e34 0x222c6e 0x223a29 0x226922 0x2d0fec 0x21dbc4 0x21ddbf 0x21df55 0x226f67 0x2e75 0x1ea7b7 0x1eada7 0x1ebfab 0x1fd315 0x1fe24b 0x1efcf8 0x25fadf9 0x25faad0 0x150dbf5 0x150d962 0x153ebb6 0x153df44 0x153de1b 0x1eb7da 0x1ed65c 0x2bad 0x2ad5)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

EXC_BAD_ACCESSトレース: asm コード

この種のエラーは一度もなかったので、完全に迷っています。このUICollectionViewを他のアプリにほぼ同じ方法で実装しました(ただし、スクロールビューではなく、メインビューでした)。何が間違っている可能性がありますか?ありがとう!

4

1 に答える 1

3

[診断]タブの[スキームの編集]でNSZombieを有効にすることをお勧めします。すべてのEXC_BAD_ACCESSエラーが見つかります。

于 2012-10-27T18:25:11.627 に答える