由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“UICollectionView 必须使用非零布局参数初始化

Posted

技术标签:

【中文标题】由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“UICollectionView 必须使用非零布局参数初始化【英文标题】:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter 【发布时间】:2015-12-07 16:07:14 【问题描述】:

我在三个页面中有相同的代码,但是其中两个出现了这个错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“UICollectionView 必须使用非零布局参数进行初始化

我不明白为什么,如果三页中的代码相同,而第一页中的代码没有任何问题。

我在头文件中的代码

#import <UIKit/UIKit.h>

@interface CollectionViewController : UICollectionViewController<UICollectionViewDataSource>

@property (nonatomic,strong) NSMutableArray *marrImages;
@property (nonatomic,strong) NSMutableDictionary *mdictImageData;



@end

在.m文件中

@interface CollectionViewController ()

@end

@implementation CollectionViewController


@synthesize marrImages,mdictImageData;

static NSString * const reuseIdentifier = @"cell";


- (void)viewDidLoad 
    [super viewDidLoad];

    //navigation bar
    UIImage *image = [UIImage imageNamed:@"home.png"];
    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    backButton.frame = CGRectMake(0, 0, 50, 50);
    [backButton setImage:image forState:UIControlStateNormal];
    //    [backButton addTarget:self action:@selector(leftButtonAcion:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = button2;
    self.title = @"Welcome";

    marrImages=[[NSMutableArray alloc]init];

    mdictImageData=[[NSMutableDictionary alloc]initWithObjectsAndKeys:@"circlshadow_parking.png",@"imageFile",@"Estacionamentos",@"Info",nil];
    [marrImages addObject:mdictImageData];

   mdictImageData=[[NSMutableDictionary alloc]initWithObjectsAndKeys:@"circlshadow_charging.png",@"imageFile",@"Carregar Saldo",@"Info", nil];
    [marrImages addObject:mdictImageData];




- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];


#pragma mark <UICollectionViewDataSource>

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
    return [marrImages count];



- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    cell.lblIndex.text=[[marrImages objectAtIndex:[indexPath row]]valueForKey:@"Info"];
    UIImage *image=[UIImage imageNamed:[[marrImages objectAtIndex:[indexPath row]]valueForKey:@"imageFile"]];
    [cell.ivCartoon setImage:image];
    return cell;



- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];




    if(lastIndex == 0)
    
        ParkingMenu *parkingMenu = [[ParkingMenu alloc] init];
        parkingMenu.modalPresentationStyle = UIModalPresentationPageSheet;
        parkingMenu.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self.navigationController pushViewController:parkingMenu animated:YES];
        [parkingMenu release];

    
    else if(lastIndex == 1)
    

        BalanceMenu *balanceMenu = [[BalanceMenu alloc] init];
        balanceMenu.modalPresentationStyle = UIModalPresentationPageSheet;
        balanceMenu.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self.navigationController pushViewController:balanceMenu animated:YES];
        [balanceMenu release];

    
    else if(lastIndex == 2)
    
    
    else if(lastIndex == 3)
    
    


@end

【问题讨论】:

这些控制器实例是如何创建的(显示代码)? 我在故事板中有我的观点。这是我的第一个应用程序,对此我知之甚少。我需要在某个地方实例化,因为前者没有这样做,一切都很好。 所以是停车和平衡“页面”有问题吗?它们是在情节提要中定义的吗?它们在故事板中是如何定义的? 我的故事板:postimg.org/image/50natv1st 现在呢? s30.postimg.org/srmobz201/… 【参考方案1】:

这段代码:

    ParkingMenu *parkingMenu = [[ParkingMenu alloc] init];
    parkingMenu.modalPresentationStyle = UIModalPresentationPageSheet;
    parkingMenu.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self.navigationController pushViewController:parkingMenu animated:YES];
    [parkingMenu release];

表明您正在创建ParkingMenu 的实例,而没有引用情节提要。大概这是 UICollectionViewController 的子类,导致您不使用指定的初始化程序 initWithCollectionViewLayout: 或从情节提要中取消归档(这也会设置布局)。

你也没有使用 ARC,所以你必须打电话给release,你真的不应该这样做......

您需要更新代码,以便触发视图控制器之间的 segue,或者按标识符从情节提要中加载 ParkingMenu

【讨论】:

这取决于情节提要中的内容。无法看到您的图片,因为它在此处被阻止... 我解决了这个 UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"ParkingMenu"]; [self presentViewController:vc动画:YES完成:NULL];但是导航栏在接下来的两个页面上消失了 这是按标识符的方法(而不是 segue) 我不明白你的意思。对不起 在我的回答 1 中列出了 2 个潜在的解决方案,该代码是其中的第二个,仅供您参考

以上是关于由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“UICollectionView 必须使用非零布局参数初始化的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序