NSArrayM replaceObjectAtIndex:withObject: 对象不能为 nil'

Posted

技术标签:

【中文标题】NSArrayM replaceObjectAtIndex:withObject: 对象不能为 nil\'【英文标题】:NSArrayM replaceObjectAtIndex:withObject: object cannot be nil'NSArrayM replaceObjectAtIndex:withObject: 对象不能为 nil' 【发布时间】:2014-11-24 02:16:33 【问题描述】:

我有一个项目与this 相同的菜单,但子菜单具有相同的幻灯片动画。我创建了一个 xib 文件,将其命名为 SecondMenu.xib。文件所有者是 UIViewController 并将其命名为 SecondMenuController。如果您检查项目REFrosted(check the link),则有DEMOMenuViewController(UIViewController)。在方法 didSelectRowAtIndexPath:.我在我的代码中更改了它

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


    NSMutableArray *controllers = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < 1; i++) 
        [controllers addObject:[NSNull null]];
    
    self.viewControllers = controllers;
    SecondMenuController  *controller = [self.viewControllers objectAtIndex:0];

    if ((NSNull *)controller == [NSNull null]) 
        controller = [[SecondMenuController  alloc] initWithNibName:@"SecondMenu" bundle:nil];
        [self.viewControllers replaceObjectAtIndex:0 withObject:controller];

    

    controller.view.frame = CGRectMake(-self.view.frame.size.width, 0,self.view.frame.size.width,self.view.frame.size.height);

    [self.view addSubview:controller.view];


    [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^
        controller.view.frame = CGRectMake(0, 0,self.view.frame.size.width,self.view.frame.size.height);
     completion:^(BOOL finished) 
        NSLog(@"Done!");
    ];

    //[self hideMenu];


当连接到子菜单(即 SecondMenuController)时,该代码对我有用。在我的 SecondMenuController 中,我添加了一个按钮(这将连接到 DEMOHomeViewController,故事板标识符是 homeController)。这是我的按钮的代码

- (IBAction)buttonConnect:(id)sender 
    DEMONavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentController"];

    DEMOHomeViewController *homeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"];
    navigationController.viewControllers = @[homeViewController];

    self.frostedViewController.contentViewController = navigationController;
    [self.frostedViewController hideMenuViewController];

在将其更改为 didSelectRowAtIndexPath 中的代码之前,我在 REFrosted 中获得了此代码:(正如我在上面第一个代码中提到的那样)。为什么会出现这个错误

'NSInvalidArgumentException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: object cannot be nil'

我导入所有文件。据我了解,当您导入连接到文件所有者的文件时。这意味着当您将它实例化到我的 SecondMenuController 中时,我可以控制该文件中的每个方法或函数(这仅基于我的经验,如果我错了,请纠正我。我只想知道系统是如何工作的)。请看我的代码。我在这里错过了什么吗?希望您能就如何解决此问题或解释我收到此错误的原因提供建议。

    DEMONavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"contentController"];

    DEMOHomeViewController *homeViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"];
    navigationController.viewControllers = @[homeViewController];

【问题讨论】:

您对错误信息有什么不明白的地方?它说controller 是 nil,你确认它不是 nil 吗? NSLog() 例如?你需要调试你的代码。 是的 homeViewController 为零。为什么是零?该类已连接到板。 调试时间。仔细检查所有内容,拼写错误,类名等。重新阅读文档。 【参考方案1】:

为此搜索了 2 天的答案。我终于明白了。

当我单击按钮时 DEMOHomeViewController 为 nil 的原因是因为 SecondMenuController 没有连接到 DEMOHomeViewController,即使我将它实例化到 SecondMenuController 类。我现在学习。这是代码

我做的第一个代码。我添加了这个 SecondMenuController.h

@property (nonatomic, weak) UIStoryboard * myself;
@property (nonatomic, strong) REFrostedViewController * ref;   
 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myStoryBoard:(UIStoryboard *) xStoryBoard ref: (id) xRef;

在 SecondMenuController.m 中

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myStoryBoard:(UIStoryboard *) xStoryBoard ref: (id) xRef

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
        self.myself = xStoryBoard;
        self.ref = xRef;
    
    return self;

在我的按钮中

DEMONavigationController *navigationController = [self.myself instantiateViewControllerWithIdentifier:@"contentController"];

DEMOSecondViewController *secondViewController = [self.myself instantiateViewControllerWithIdentifier:@"homeController"];

navigationController.viewControllers = @[secondViewController];


self.ref.frostedViewController.contentViewController = navigationController;
    [self.ref.frostedViewController hideMenuViewController];

现在它正在工作。您需要做的就是调用 DEMOMenuViewController 的 initWithNibName: 方法。

【讨论】:

【参考方案2】:

控制台日志表示您试图在 NSArray 中插入 nil 对象,这是不允许的。如果由于某种原因您需要添加空对象,请改用(NSArray *)[NSNull null]

【讨论】:

感谢罗素。我已经检查过了。我想念的唯一代码是,我没有在两个控制器之间添加连接。

以上是关于NSArrayM replaceObjectAtIndex:withObject: 对象不能为 nil'的主要内容,如果未能解决你的问题,请参考以下文章

无法将“__NSArrayM”类型的值转换为“NSDictionary”

NSArrayM 中的异常 insertObject:atindex

集合 <__NSArrayM: 0x7fa1f2711910> 在枚举时发生了突变

在映射集合时快速获取异常“所需类型 = NSOrderedSet;给定类型 = __NSArrayM”

NSArraym 在枚举时发生了变异,sqlite3 while 循环?

无法识别的选择器发送到实例 NSArrayM [关闭]