Pru*_*goe 3 arrays cocoa subview superview
我有一个广告布局程序,它构建页面(NSView类页面),并在每个页面上放置边距和装订线(更多NSViews),然后是广告(NSView类广告).该应用自动从数据库源中放置广告,寻找适当的空间来填充每个页面.然后,用户可以选择将广告从第4页移至第2页.他们还可以选择手动投放广告或让应用自动流动,假设您刚刚移动的广告最终会以0/0 x/y位置,然后其他人将流向任何可用空间,如果当前空间没有空间(由于您刚刚移动的广告),则推送到下一页.
我正在做的是获取所有页面(它们自己是NSView的子视图,称为母版页),然后循环遍历它们以将所有子视图放入数组中.循环遍历该数组,过滤边距和装订线,如果是广告,则将其从超级视图中删除.我的想法是从干净的页面开始并替换所有广告.问题是我一直收到这个错误:
Collection <NSCFArray: 0x1078900> was mutated while being enumerated.
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码:
//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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想我很困惑为什么我得到这个错误.我认为数组中的对象与循环中创建的对象是分开的.
由于每个页面上的广告数量是动态的,如何在不使用阵列的情况下将其从超级视图中删除?
正如错误所说,使用快速枚举时,您无法修改数组的内容.removeFromSuperview
从superview的subviews
数组中删除视图(这是一个难以阅读的句子!).这意味着您在枚举时正在改变数组.
可能有更好的方法,但您可以NSMutableArray
使用广告视图填充,然后一旦完成,您可以将它们从超级视图中删除(未经测试的代码,在浏览器中输入!)
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];
Run Code Online (Sandbox Code Playgroud)
小智 5
上面的答案相当昂贵,为什么在可以避免的情况下创建对象呢?你可以用更少的代码做同样的事情.
while([[superView subviews] count] > 0) {
[[[superView subviews] objectAtIndex:0] removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)
编辑:我是Objective C和Cocoa的新手,所以我不知道这是否可以在没有ARC的情况下工作,因为我从来没有编过代码.
归档时间: |
|
查看次数: |
5258 次 |
最近记录: |