调用“[super layoutSubviews]”会抛出“[__NSArrayM objectAtIndex:]: index 1 beyond bounds”异常
Posted
技术标签:
【中文标题】调用“[super layoutSubviews]”会抛出“[__NSArrayM objectAtIndex:]: index 1 beyond bounds”异常【英文标题】:Calling "[super layoutSubviews]" throws "[__NSArrayM objectAtIndex:]: index 1 beyond bounds" exception 【发布时间】:2014-03-03 13:38:06 【问题描述】:每当我调用 [super layoutSubviews];在我的自定义 UINavigation 栏上它抛出* 由于未捕获的异常 'NSRangeException' 导致应用程序终止,原因:'* -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
这是我唯一重写的两种方法:
-(void) layoutSubviews
[super layoutSubviews];
for (UIView *view in self.subviews)
CGRect frame = view.frame;
frame.origin.y = 5;
view.frame = frame;
- (CGSize)sizeThatFits:(CGSize)size
[self setTitleVerticalPositionAdjustment:-7 forBarMetrics:UIBarMetricsDefault];
CGRect frame = [UIScreen mainScreen].applicationFrame;
CGSize newSize = CGSizeMake(frame.size.width , 64);
return newSize;
应用程序正在使用情节提要,我在加载视图时向 UINavigationBar 动态添加内容,但即使我禁用此内容注入,仍然会抛出错误,这似乎是调用 [super layoutSubviews] 的行为;这是导致此异常的原因,
有没有人知道为什么会发生这种情况?
您可以看到,在抛出异常后,UINavigationBar 中的所有项目都已正确定位。
亲切的问候,
帕特里克·J·奎因。
【问题讨论】:
【参考方案1】:来自文档...
你不应该直接调用这个方法。如果你想强制一个 布局更新,请先调用 setNeedsLayout 方法而不是这样做 到下一次图纸更新。如果你想更新你的布局 立即查看,调用 layoutIfNeeded 方法。
你应该使用...
[super setNeedsLayout];
如果你需要调用它,我怀疑你真的这样做了。
【讨论】:
嘿,感谢您的输入,我试试看(我假设这是从视图控制器调用的,而不是被覆盖的导航栏?)。完成上述操作的原因是在导航栏重新调整大小后重新对齐 UINavigationBarButtonItems,否则它们只是锚定到视图的底部,就好像它是默认大小一样 :) 谢谢。 按照您的做法覆盖该函数,但不要使用[super layoutSubviews]
,而是尝试使用[super setNeedsLayout]
。没有它,它甚至可以工作。
或者根本不调用任何超级方法。
没错。这也是我的想法。 (因此“可能甚至不需要它”)。
好吧做了一些测试 :) 似乎它没有调用 super 这就是问题所在,它覆盖了 layoutSubview 方法!完全删除超级调用会导致原始问题并调用 [super setNeedsLayout]; in 该方法会导致应用程序仅挂起(无异常或输出)在初始屏幕上。感谢你们的快速反应,这就是为什么 SO 是这个星球上最伟大的社区 :)以上是关于调用“[super layoutSubviews]”会抛出“[__NSArrayM objectAtIndex:]: index 1 beyond bounds”异常的主要内容,如果未能解决你的问题,请参考以下文章