gpt4 book ai didi

arrays - NSView 从 super View 中删除一些 subview

转载 作者:行者123 更新时间:2023-12-03 16:16:07 24 4
gpt4 key购买 nike

我有一个广告布局程序,它构建页面(NSView 类页面),并在每个页面上放置边距和装订线(更多 NSView),然后放置广告(NSView 类广告)。该应用程序自动从数据库源放置广告,寻找合适的空间来填充每个页面。然后,用户可以选择将广告从第 4 页移动到第 2 页。他们还可以选择手动流动广告或让应用程序自动流动,假设您刚刚移动的广告最终会出现在 0/0 x/y 位置,然后其他页面将流向任何可用空间,如果当前页面没有空间(由于您刚刚移动的广告),则被推送到下一页。

我所做的是获取所有页面(它们本身是称为 masterpage 的 NSView 的 subview ),然后循环遍历它们以将所有 subview 放入数组中。循环遍历该数组,过滤边距和装订线,如果它是广告,则将其从 super View 中删除。我的想法是从一个干净的页面开始并替换所有广告。问题是我不断收到此错误:

Collection <NSCFArray: 0x1078900> was mutated while being enumerated.

我正在使用此代码:

//loop through all the pages
for(NSView* thisPage in masterPageSubViews) {

//get all the ads on this page
NSArray* thisPageSubviews = [thisPage subviews];
for(NSView* thisPageSubview in thisPageSubviews) {
if ([[thisPageSubview className] isEqual:@"Ad"]) {
[thisPageSubview removeFromSuperview];
}
}
}

我想我很困惑为什么会收到此错误。我认为数组中的对象与循环中创建的对象是分开的。

由于每个页面上的广告数量是动态的,如何在不使用数组的情况下将它们从 super View 中删除?

最佳答案

正如错误所述,在使用快速枚举遍历数组时无法修改数组的内容。 removeFromSuperview 从其父 View 的 subviews 数组中删除 View (这句话很难读!)。这意味着您在枚举数组时正在改变数组。

可能有更好的方法,但是您可以使用一个 NSMutableArray 来填充广告 View ,然后一旦完成,您可以让它们从 super View 中删除自己(未经测试的代码) ,在浏览器中输入!)

NSMutableArray *viewsToRemove = [[NSMutableArray alloc] init];
for(NSView* thisPage in masterPageSubViews)
{
//get all the ads on this page
NSArray* thisPageSubviews = [thisPage subviews];
for(NSView* thisPageSubview in thisPageSubviews)
if ([thisPageSubview isMemberOfClass:[Ad class]])
[viewsToRemove addObject:thisPageSubview];
}
[viewsToRemove makeObjectsPerformSelector:@selector(removeFromSuperview)];
[viewsToRemove release];

关于arrays - NSView 从 super View 中删除一些 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7969041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com