Подтвердить что ты не робот

Как удалить 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

4b9b3361

Ответ 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()
}