Регистровый класс UICollectionView не работает в UIViewController (с изображениями, кодом и журналом)
-
21-12-2019 - |
Вопрос
У меня есть программа, в которой я хочу разделить экран на две разные части (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)
Решение
Вы создаете представление коллекции в init, правильно регистрируете свой класс и устанавливаете его в свой (предположительно) выход.
Затем представление будет загружено, что происходит позже чем init, и это создаст другой вид коллекции и назначьте его торговой точке.В этом представлении коллекции не зарегистрирован класс, поэтому оно завершается сбоем.
Непонятно, зачем вам создавать представление коллекции, если оно есть в вашем xib, если только это не отчаянный обходной путь.
Правильнее всего зарегистрировать класс в viewDidLoad
, после чего представление коллекции из пера будет существовать.