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”