NSView Remove SubViews

2020-12-22  本文已影响0人  yxibng

想要遍历删除NSView 的所有子视图,遇到了异常:
Collection <__NSArrayM: 0x600000c8d350> was mutated while being enumerated.

- (void)viewDidLoad {
    [super viewDidLoad];
    for (NSInteger i = 0; i< 10; i ++) {
        [self.view addSubview:[NSView new]];
    }
    for (NSView *view in self.view.subviews) {
        [view removeFromSuperview];
    }
}

分析

(lldb) po self.view.subviews
<__NSArrayM 0x600000c8d350>(
<NSView: 0x101922570>,
<NSView: 0x101922ea0>,
<NSView: 0x101922b50>,
<NSView: 0x101923100>,
<NSView: 0x1019234b0>,
<NSView: 0x10191c360>,
<NSView: 0x101923c00>,
<NSView: 0x101923fb0>,
<NSView: 0x101924360>
)

结论: self.subViews 是一个可变数组,在遍历的时候移除会抛异常。

更改为如下,问题解决

- (void)viewDidLoad {
    [super viewDidLoad];
    
    for (NSInteger i = 0; i< 10; i ++) {
        [self.view addSubview:[NSView new]];
    }
    
    for (NSView *view in self.view.subviews.copy) {
        [view removeFromSuperview];
    }
    // Do any additional setup after loading the view.
}

上一篇 下一篇

猜你喜欢

热点阅读