UIScrollView: подвид добавлен, но не отображается

У меня есть UIScrollView, называемый скроллером. У него есть подвиды, которые являются пользовательскими кнопками UIButtons. Я пытаюсь напечатать количество подзаголовков до и после добавления, как показано ниже.

    NSLog(@"Adding %d b4 %d",buttonno, [[self.scroller subviews] count]);
    [self.scroller addSubview:menuBtn];
    NSLog(@"Adding %d after %d",buttonno, self.scroller.subviews.count);

Подвид не отображается. Но количество подпредставлений увеличивается, например, вывод этого похож на

2014-03-11 17:53:49.863 ПК2[4519:60b] Добавление 1 b4 10

2014-03-11 17:53:49.872 PC2[4519:60b] Добавление 1 после 11

Но когда я пытаюсь напечатать количество подвидов с помощью тестовой кнопки, которая запускает код

NSLog(@"Buttons subviews: %d",self.scroller.subviews.count);

Я вижу, что подвид не добавляется. Я также вижу, что подвид не добавляется, когда вижу переменные в отладчике.

Кстати, я добавляю кнопки на основе таймера [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(checkForTiles) userInfo:nil repeats:YES];

Обновление :: Код для добавления подвида

                if (!alreadyExists)
{
    NSLog(@"Adding %d b4 %d",buttonno, [[self.scroller subviews] count]);
    //AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
    pccButtonViewController *menuBtn=nil;
    menuBtn=[pccButtonViewController alloc ];
    menuBtn = [pccButtonViewController buttonWithType:UIButtonTypeCustom];
    menuBtn.no=buttonno;
    menuBtn.slotNo=buttonCount;
    menuBtn.frame = [[slotFrames objectAtIndex:menuBtn.slotNo] CGRectValue];
    [menuBtn setBackgroundImage:[UIImage imageNamed:[[NSString alloc] initWithFormat:@"L%02d_Tile.jpg",buttonno]] forState:UIControlStateNormal];
    [menuBtn addTarget:self action:@selector(miniButtons:) forControlEvents:UIControlEventTouchUpInside];
    menuBtn.no=buttonno;
    menuBtn.alpha=0.0f;
    [self.scroller addSubview:menuBtn];
    NSLog(@"Adding %d after %d",buttonno, self.scroller.subviews.count);
    //NSLog(@"Subview Added %d btn no:%@",buttonno,[slotFrames objectAtIndex:menuBtn.slotNo]);
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0f];
    //self.menuBtn.frame = CGRectMake(8, 10, 50, 60);
    menuBtn.alpha=1.0f;
    [UIView commitAnimations];
    [buttons addObject:menuBtn];
    buttonCount++;
}
buttonclicked=0;
[self.scroller  setContentSize:CGSizeMake([self.scroller  bounds].size.width,(ceil(buttonCount/tilesPerRow)+1)*[self.scroller  bounds].size.width/tilesPerRow/2*3)];
appdelegate.Sharevar.vidsyncButtons=self.scroller.subviews.copy;//Used to maintain State when the view is presented for the second time

Это прекрасно работает, когда представление запускается в первый раз. Проблемы возникают, когда оно запускается во второй раз. Я удаляю представление из appdelegate следующим образом

-(void)removeAnyView
{
NSLog(@"Removing");
if (viewonScreen)
{
    viewonScreen=false;
    [self.inPort prepareToBeDeleted];
    self.inPort=Nil;
    [self.window.rootViewController dismissViewControllerAnimated:NO completion:^{[self     presentView];}];
 }

}

person Ansel Zandegran    schedule 11.03.2014    source источник
comment
Можете ли вы опубликовать код для добавления просмотров в ваш скроллер?   -  person lvp    schedule 11.03.2014


Ответы (3)


Прошло много времени.. Я забыл об этом вопросе.. Ошибка была вызвана тем, что не сделал недействительным NSTimer.. С ними нужно быть осторожным..

person Ansel Zandegran    schedule 18.12.2015

Любые обновления пользовательского интерфейса должны быть в основном потоке, а ваш NSTimer не будет, поэтому вам нужно сделать что-то вроде этого...

dispatch_sync(dispatch_get_main_queue(), ^{
    [self.scroller addSubview:menuBtn];
});
person Flexicoder    schedule 11.03.2014
comment
Я делаю так в функции checkforTiles [self PerformSelectorOnMainThread:@selector(addTile:) withObject:content waitUntilDone:YES]; Этого не будет достаточно?? - person Ansel Zandegran; 11.03.2014
comment
Я думаю, вам придется опубликовать больше кода, чтобы люди могли видеть, что происходит. На данный момент недостаточно, чтобы продолжать - person Flexicoder; 11.03.2014
comment
Попробовал то, что вы предложили, и приложение зависло. Нет ответа. Оно застряло при выполнении. Теперь выдаются ошибки. - person Ansel Zandegran; 11.03.2014

Изменить это

menuBtn=[pccButtonViewController alloc ];

к этому

menuBtn=[[pccButtonViewController alloc ] init];

Из документации:

кнопка с типом:

Этот метод представляет собой удобный конструктор для создания объектов-кнопок с определенными конфигурациями. Если вы создаете подкласс UIButton, этот метод не возвращает экземпляр вашего подкласса. Если вы хотите создать экземпляр определенного подкласса, вы должны выделить/инициализировать кнопку напрямую.

person lvp    schedule 11.03.2014
comment
Тем не менее проблема преобладает - person Ansel Zandegran; 12.03.2014