ページを作成する広告レイアウトプログラム(NSViewクラスPage)があり、各ページに余白とガター(より多くのNSView)を配置し、次に広告(NSViewクラスAd)を配置します。アプリはデータベースソースから広告を自動的に配置し、各ページに入力する適切なスペースを探します。次に、ユーザーは広告をたとえば4ページから2ページに移動するオプションがあります。また、移動したばかりの広告が0 /になると想定して、手動で広告をフローするか、アプリを自動フローするオプションもあります。 0 x / yの場所、そして他の場所は利用可能なスペースに流れ、現在のページにスペースがない場合は次のページにプッシュされます(移動したばかりの広告のため)。
私が行っていたのは、すべてのページ(masterpageと呼ばれるNSViewのサブビュー)を取得し、それらをループしてすべてのサブビューを配列に入れることでした。その配列をループし、余白とガターをフィルタリングし、広告の場合はスーパービューから削除します。私の考えは、きれいなページから始めて、すべての広告を置き換えることでした。問題は、このエラーが発生し続けることです。
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];
}
}
}
なぜこのエラーが発生するのか混乱していると思います。配列内のオブジェクトは、ループ内で作成されているオブジェクトとは別のものだと思いました。
各ページの広告の数は動的であるため、配列を使用せずにスーパービューから広告を削除するにはどうすればよいですか?