----- Original message ----- > > * Forgot not to modify the array during the enumeration. > > * Remove the extra subviews to improve the lookup speed on additions. > > > > why it's _sub_views and not _subviews? > > I don't know, but I have observed that various GNUstep classes written a > long ago have ivars named in a similar way. > > > - (void) setSubviews: (NSArray *)newSubviews > > { > > NSEnumerator *en; > > NSView *aView; > > > > en = [[NSArray arrayWithArray:_subviews] objectEnumerator]; > > while ((aView = [en nextObject])) > > { > > if (NO == [newSubviews containsObject:aView]) > > { > > [aView removeFromSuperview]; > > } > > } > > > > NSMutableArray *uniqNew = [NSMutableArray array]; > > en = [newSubviews objectEnumerator]; > > while ((aView = [en nextObject])) > > { > > id supersub = [aView superview]; > > if (supersub != nil && supersub != self) > > { > > [NSException raise:NSInvalidArgumentException > > format:@"Superviews of new subviews must be either > > nil or > > receiver."]; } > > > > if ([uniqNew containsObject:aView]) > > { > > [NSException raise:NSInvalidArgumentException > > format:@"Duplicated new subviews."]; > > } > > > > if (NO == [_subviews containsObject:aView]) > > { > > [self addSubview:aView]; > > } > > > > [uniqNew addObject:aView]; > > } > > > > ASSIGN(_subviews, uniqNew); > > } > > This looks ok. However I think this code doesn't match this requirement > written in the Cocoa doc: "And any views that are in both subviews and > newSubviews are moved in the subviews array as needed, without being > removed and re-added." > > Cheers, > Quentin.
Im still not sure why it is not. I thought of that case, only views that werent shared by both arrays will either be added or removed, else they only got sorted and assigned back as uniqNew.
_______________________________________________ Gnustep-dev mailing list Gnustep-dev@gnu.org https://lists.gnu.org/mailman/listinfo/gnustep-dev