подпредставление не отображается в уже отображенном виде - PullRequest
0 голосов
/ 23 августа 2011

Я новичок в разработке для iPhone и застрял с подпредставлением, которое не отображается после уведомления контроллера о необходимости обновления этих элементов.

Итак, это моя главная страница, показывающая 3 последних элементановостной ленты внизу.Контроллер представления управляет загрузкой новостной ленты (в NSArray).При загрузке страницы лента новостей корректно отображается как подпредставление основного вида.Однако, когда представление уже существует (например, сразу после первого входа в систему), новостная лента не отображается и не обновляется.Изображения аватара, которые извлекаются из Интернета асинхронно, отображаются правильно.Но не надписи.

Отладка показывает, что код выполняется правильно ... но ничего не происходит ...

Вот код, обрабатывающий уведомление и обновление.

Я уверен, что упустил что-то глупое, но не могу понять, что на нем.Может ли UILabel или UIImage подпредставления избежать обновления элемента?

Спасибо за помощь!

Код контроллера

-(void) handleRefreshNewsfeed:(NSNotification*)notification{

if (self.newsfeedMostRecentDate == nil){
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyyMMdd HH:mm"];
    self.newsfeedMostRecentDate = [dateFormatter dateFromString:@"20100101 00:00"];
    [dateFormatter release];
}
NSArray * newsfeed = [cdw getNewsfeedForUser:self.currentUser andLimit:self.newsfeedLimit];
if ([newsfeed count] > 0){
    self.newsfeedMostRecentDate = [(Newsfeed *)[newsfeed objectAtIndex:0] posted];
    if ([self.view isKindOfClass:[MenuView class]]){
        [(MenuView *)self.view refreshNewsfeed:newsfeed];
    }
}

}

Декларация основного вида:

@interface MenuView : UIView {
MenuNewsfeed                * newsFeedView;  
}
@property(nonatomic, retain) IBOutlet MenuNewsfeed *newsFeedView;

-(void)displayNewsfeed:(NSArray *)newsfeed;
-(void)refreshNewsfeed:(NSArray *)newsfeed;

Код основного вида:

-(void)displayNewsfeed:(NSArray *)newsfeed{
[self.newsFeedView setCurrentUser:currentUser];
[self.newsFeedView displayNewsfeed:newsfeed];

[UIView animateWithDuration:0.75f
    delay: 0.0
        options: UIViewAnimationOptionCurveEaseIn
     animations:^{
         self.newsFeedView.alpha = 1.0;
     }
     completion:^(BOOL finished){
         //nothing
     }
 ];
}

-(void)refreshNewsfeed:(NSArray *)newsfeed{

if ([self.newsFeedView.newsfeed count] > 0){
    [UIView animateWithDuration:0.50f
         delay: 0.0
            options: UIViewAnimationOptionCurveEaseIn
         animations:^{
             self.newsFeedView.alpha = 0.0;
         }
         completion:^(BOOL finished){
            // [self displayNewsfeed:newsfeed];
         }
     ]; 
}else {

    [self displayNewsfeed:newsfeed];
}
}

Майкл

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

Я выяснил, в чем проблема: код, обрабатывающий уведомление (и изменяющий пользовательский интерфейс), не был обработан в главном потоке.

[self performSelectorOnMainThread:@selector(refreshNewsfeed) withObject:notification.object waitUntilDone:NO];

Вызов метода обновления с помощью executeSelectorOnMainThread решил проблему.

0 голосов
/ 23 августа 2011

Это может не решить вашу проблему.

Однако есть небольшой глюк, который я вижу. CGRectMake (50, 100, 55, 12) создаст прямоугольник размером 12 пикселей, но высотой 55 пикселей.

Ну, по крайней мере, "te" или "tes" вашего текста должны быть видны, поскольку я не вижу никаких насекомых. С некоторым значением насекомого (10 или около того) может случиться так, что заметка вашей текстовой строки станет видимой.

Или нет. Когда текст обрезается, в зависимости от режима разрыва строки по умолчанию, он может быть обрезан до некоторого расширения, а в конце добавлено несколько символов «...». Может ли быть так, что вы видите только некоторые пункты вместо «тест-тест-тест»?

В противном случае проверьте, скрыта ли метка tmp каким-либо другим представлением, хотя она должна быть больше поверх стека представления.

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

...