调用“[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”异常的主要内容,如果未能解决你的问题,请参考以下文章

自调整大小的集合视图在 iOS 15 中进入递归循环

ios11 Swift 自定义导航条上移20点解决方法

快速在 UIButton 上显示图像和标题

iOS:仅在 iOS 13 上不会触发点击事件

如何在 Swift 4 的 UIView 中创建带圆角的渐变边框

表达方式过于复杂,无法在合理时间内解决;考虑将表达式分解为不同的子表达式