UICollectionView registerClassがUIViewControllerで機能しない(写真、コード、ログ付き)

StackOverflow https://stackoverflow.com//questions/25027619

質問

画面を 2 つの異なるセクションに分割したいプログラムがあります (rootMenuController として UINavigationController がすでにあるため、UISplitViewController はここでは適用できません)。

問題は、UITableView または UICollectionView を使用して取得できないことです。 registerClass 方法。UITableView の場合は問題ありませんが、UICollectionView の場合は必須です。シミュレータを実行して、UICollectionView が切断された状態でどのように見えるかを示しました。

セル再利用識別子のクラスを登録しないという点で、私は何を間違っているのでしょうか>

#import "SELMenuViewController.h"

@interface SELMenuViewController () <UITableViewDataSource, UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate>

@property (weak, nonatomic) IBOutlet UIButton *backButton;
@property (weak, nonatomic) IBOutlet UIButton *paymentButton;

@end

@implementation SELMenuViewController
- (IBAction)employeeSelect:(id)sender {
    [self.navigationController popViewControllerAnimated:YES];
    self.navigationController.navigationBarHidden = NO;
}

- (IBAction)paymentScreen:(id)sender {
    NSLog(@"payment screen");
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:    (NSInteger)section {
    return 1;
}

-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"menuCell" forIndexPath:indexPath];

    cell.backgroundColor = [UIColor redColor];
    return cell;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    cell.textLabel.text = @"text";
    return cell;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        self.itemsOrdered = [[UITableView alloc] init];
        self.menuItems = [[UICollectionView alloc] initWithFrame:self.view.frame     collectionViewLayout:[[UICollectionViewFlowLayout alloc] init]];
    [self.menuItems registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"menuCell"];
    }
    return self;
}

こちらがエラーログです...

2014-07-29 18:52:40.302 オリンポス[2267:60b] * [UICOLLECTIONVIEW _DEQUEUEUERUSABLEVIEWOFKIND:withIdentifier:forindexpath:viewcategory:]、/sourcache/uikit_sim/uikit-2935.137/uicollectionview.m:3241 2014-07-29 18:52:40.306 Olympos [2267 キャッチされなかった例外「NSInternalInconsistencyException」によりアプリを終了します。理由:'種類のビューをデキューできませんでした:識別子のuicollectionelementkindcell-識別子にペン先またはクラスを登録するか、ストーリーボードにプロトタイプセルを接続する必要があります。***最初のスローコールスタック:(0 CoreFoundation 0x00000001019A5495 ExceptionPreprocess + 165 1 libobjc.a.dylib 0x000000010170499e objc_exception_throw + 43 2 Corefoundation 0x00000001019A531A + [NSEXCEPTION RAISE:FORMAT:] + 106 3 FASOND 0X000001012A0F19- [NSSASTIONTIONTIONTIONTIONTIONTIONTIONER ] + 189 4 UIKIT 0x000000010083E2B7 - [uicollectionView _dequeueuerusableviewofkind:withidentifier:forindexpath:viewcategory:] + 1324 5 olympos 0x000000013013efe- [selmenuviewcontroller collectionview:cellforitematindexpath:] + 110 6 uikiT0100831cae -uped00831cae _ indexpath:withlayoutattributes:applicattributes:] + 264 7 uikit 0x000000010083330b- [uicollectionView _updatevisiblecellsnow: ] + 3581 8 UIKIT 0x0000000100836AE1- [UICOLLECTIONVIEW LAYOUTSUBVIEWS] + 243 9 UIKIT 0x0000000100311993- [UIVIEW(CALAYERDELEGATE)レイアウト出版物FublayERSOFLAYER:] + 354 10 QuartzCore 0x0000010475802-15 -1154 X000000010446A369 _ZN2CA5LAYER16LAYOUT_IF_NEEDEDEPNS_10RTANSACTIONE + 363 12 QuartzCore 0x000000010446A1EA _ZN2CA5LAYER28LAYOUT_DISPLAY__NEEDEDEPNS_1RTRANSICTIONE + 24 13 QuartzCore 0x00000001043DDFB8 _ZN2CA7CONTEXT18COMMIT_TRANSACTIONEPNS_1TRASSACTIONACTIONACTIONATEE + 252 14 QuartzCore 0x00000001043DF030 _ZN2CA11TRANSACTION6COMMITEV + 394 callbackep19______cfrunloopobservermpv + 89 16 corefoundation 0x00000001970dc7 __cfrunloop_is_calling_out_to_an_observer_callback_function + 23 17 CoreFoundation 0x0000000101970D37 __CFRUNLOOPDOOBSERVERS + 391 18 COREFoundation 0x0000000101950522 __CRUNLOOPRUN + 946 19 CoreFoundation 0x000000010194FD83 + 161 21 UIKIT 0x00000001002B1E33 UIAPPLICATIONMAIN + 1010 22 OLYMPOS 0x000000010000F663 MAIN + 115 23 LIBDYLD.DYLIB 0x00000001025235FD START + 1 24 ???0x0000000000000001 0x0+1)libc ++ abi.dylib:タイプnsexception(LLDB)を除いて、無罪で終了する

iOS Simulator Xib image

役に立ちましたか?

解決

init でコレクション ビューを作成し、クラスを適切に登録し、それを (おそらく) アウトレットに設定します。

次に、ビューがロードされます。 後で init よりも、これにより作成されます 別の コレクションビューを選択し、それをアウトレットに割り当てます。このコレクション ビューにはクラスが登録されていないため、失敗します。

必死の回避策でない限り、xib にコレクション ビューがある場合に、なぜわざわざコレクション ビューを作成するのかは不明です。

正しいことはクラスを登録することです viewDidLoad, 、その時点までにペン先からのコレクションビューが存在します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top