Регистровый класс UICollectionView не работает в UIViewController (с изображениями, кодом и журналом)

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

Вопрос

У меня есть программа, в которой я хочу разделить экран на две разные части (UISplitViewController здесь не применим, поскольку у меня уже есть UINavigationController в качестве rootMenuController.

Проблема в том, что я не могу заставить свой 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 _DequeueReusableViewOfKind: withIdentifier: forIndexPath: ViewCategory:], /Sourcecache/uikit_sim/uikit-2935.137/uicollectionview.m:3241 2014-07-29 18: 52: 40.306. Закрытие приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина:'не удалось исключить из очереди представление вида:UicollectionElementKindCell с идентификатором Menucell - должен зарегистрировать NIB или класс для идентификатора или подключить ячейку прототипа в раскадровании ***(0 CoreFoundation 0x00000001019A5495 ExceptionPreProcess + 165 1 libobjc.a.dylib 0x000000010170499e objc_exception_throw + 43 2 CoreFoundation 0x00000001019A531A + [nsexception повышение: формат:]. 189 4 uikit 0x000000010083e2b7 -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 1324 5 OlymPOS 0x0000000100013efe -[SELMenuViewController collectionView:cellForItemAtIndexPath:] + 110 6 UIKit 0x0000000100831cae -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 264 7 UIKit 0x000000010083330b -[UICollectionView _updateVisibleCellsNow: ] + 3581 8 uikit 0x0000000100836ae1 -[uicollectionView mayoutoutSubviews] + 243 9 Uikit 0x0000000100311993 -[Uiview (CalayerDelegate) LayoutoutsOflayer:] + 354 10 QuartzCore 0x000010444702 -Urayer -wublEous. x000000010446a369 _zn2ca5layer16layout_if_neededepns_11transactione + 363 12 Quartzcore 0x000000010446a1ea _ZN2CA5Layer28 Quartzcore 0x00000001043ddfb8 _zn2ca7context18commit_transactionepns_11transactione + 252 14 Quartzcore 0x00000001043DF030 _ZN2CA11TRANCACTION6COMTEV + 394 15 QUARTZCORE 0X000001043DF69DCARCERCARCER11.CANSARCERCARCER11SCRENCARCER11.CANSARCERCERCERCERCERCERCERCERC1 P19__cfrunloopobservermpv + 89 16 corefoundation 0x0000000101970dc7 __cfrunloop_is_calling_out_to_an_observer_callback_function + 23 17 CoreFoundation 0x0000000101970d37 __CFRunLoopDoObservers + 391 18 CoreFoundation 0x0000000101950522 __CFRunLoopRun + 946 19 CoreFoundation 0x000000010194fd83 CFRunLoopRunSpecific + 467 20 GraphicsServices 0x0000000104002f04 GSEventRunModal + 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