Как удалить subviews из scrollview?
Как удалить все подпредставления из моего прокрутки...
У меня есть UIView и кнопка над ним в Scrollview что-то вроде этого....
вот мой код, чтобы добавить подпредставление в представлении прокрутки
-(void)AddOneButton:(NSInteger)myButtonTag {
lastButtonNumber = lastButtonNumber + 1;
if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) {
btnLeft = 8;}
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnLeft = 162;
}
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150);
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150);
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom];
Button.frame = frame1;
Button.tag = myButtonTag;
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[Button setBackgroundColor:[UIColor clearColor]];
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted];
GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]];
GraphThumbViewControllerobj.view.frame=frame2;
GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count];
GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag];
[myScrollView addSubview:GraphThumbViewControllerobj.view];
[myScrollView addSubview:Button];
if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnTop = btnTop + 162;
}
if (btnTop+150 > myScrollView.frame.size.height) {
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));}
}
а вот код для удаления подпредставлений
if(myScrollView!=nil)
{
while ([myScrollView.subviews count] > 0) {
//NSLog(@"subviews Count=%d",[[myScrollView subviews]count]);
[[[myScrollView subviews] objectAtIndex:0] removeFromSuperview];
}
![alt text]()
Ответы
Ответ 1
Чтобы удалить все подпрограммы из любого представления, вы можете выполнять итерацию по подзонам и отправлять каждый вызов removeFromSuperview
:
// With some valid UIView *view:
for(UIView *subview in [view subviews]) {
[subview removeFromSuperview];
}
Это абсолютно безоговорочно, и избавится от подпрограмм all в данном представлении. Если вы хотите что-то более мелкозернистое, вы можете использовать любой из нескольких подходов:
- Поддерживайте собственные массивы просмотров разных типов, чтобы вы могли отправлять их
removeFromSuperview
сообщениям позже таким же образом.
- Сохраняйте все свои представления там, где вы их создаете, и держите их за указатели на эти виды, поэтому вы можете отправить их
removeFromSuperview
индивидуально по мере необходимости
- Добавьте оператор
if
в указанный выше цикл, проверяя равенство класса. Например, чтобы удалить только все UIButtons (или пользовательские подклассы UIButton), существующие в представлении, вы можете использовать что-то вроде:
// Again, valid UIView *view:
for(UIView *subview in [view subviews]) {
if([subview isKindOfClass:[UIButton class]]) {
[subview removeFromSuperview];
} else {
// Do nothing - not a UIButton or subclass instance
}
}
Ответ 2
Старый вопрос; но поскольку это первый удар по Google для этого, я подумал, что также хочу отметить, что также этот метод:
[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
Вы не можете выполнить проверку isKindOfClass с этим, но это все еще хорошее решение, чтобы знать.
Изменить: Еще один момент, который следует отметить, - это то, что полоса прокрутки scrollview добавляется в качестве подсмотра для этого прокрутки. Таким образом, если вы перебираете все подзоны прокрутки, вы столкнетесь с этим. Если его удалить, он снова добавит себя, но важно знать это, если вы ожидаете, что ваши собственные подклассы UIView будут там.
Поправка для Swift 3:
myScrollView.subviews.forEach { $0.removeFromSuperview() }
Ответ 3
Чтобы добавить к тому, что сказал Тим, я заметил, что вы помечаете свои взгляды. Если вы хотите удалить представление с помощью определенного тега, вы можете использовать:
[[myScrollView viewWithTag:myButtonTag] removeFromSuperview];
Ответ 4
Я не думаю, что вам следует использовать быстрое перечисление.
for(UIView *subview in [view subviews]) {
[subview removeFromSuperview];
}
Разве это не должно вызывать исключение, если вы меняете переработанную коллекцию? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3
Этот пример может быть лучше.
NSArray *subviews = [[scroller subviews] copy];
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
[subviews release];
Ответ 5
Проблема с UIScrollView и другими подклассами UIView заключается в том, что они содержат первоначально некоторые виды (например, вертикальную и горизонтальную полосу прокрутки для UIScrollView). Поэтому я создал категорию UIView для удаления фильтров Subviews, отфильтрованных в классе.
Например:
[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil];
Код:
- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION;
- (void)removeAllSubviewsOfClass:(Class)firstClass, ...
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];
va_list args;
va_start(args, firstClass);
for (Class class = firstClass; class != nil; class = va_arg(args, Class))
{
predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]];
}
va_end(args);
[[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)];
}
Ответ 6
Лучше всего и проще всего использовать
for(UIView *subview in [scrollView subviews])
{
[subview removeFromSuperview];
}
Это действительно вызывает сбой, поскольку основное правило - это массив, который не должен изменяться при перечислении, чтобы предотвратить использование
[[scrollView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
Но иногда крах по-прежнему появляется, потому что makeObjectsPerformSelector: будет перечислять и выполнять селектор. Также в iOS 7 операций ui оптимизированы для выполнения быстрее, чем в iOS 6. Следовательно, лучший способ повторить итерацию массива и удалить
NSArray *vs=[scrollView subviews];
for(int i=vs.count-1;i>=0;i--)
{
[((UIView*)[vs objectAtIndex:i]) removeFromSuperview];
}
Примечание: перечисление изменений вреда, но не повторение...
Ответ 7
Самый простой и лучший способ -
for(UIView *subview in [scrollView subviews]) {
[subview removeFromSuperview];
}
Ответ 8
for(subview) in self.scrollView.subviews {
subview.removeFromSuperview()
}