1

У меня очень странная проблема. Я инициализирую некоторые элементы пользовательского интерфейса внутри блока завершения AFNetworking, и только один из них (UIBarButtonItem) не инициализирует. Вот мой код, который помещается в viewDidLoad:UIBarButtonItem изображение не установлено

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

[m_httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSError* error; 
    self.m_pointData = [NSJSONSerialization 
         JSONObjectWithData:responseObject 
         options:kNilOptions 
         error:&error]; 

    [self InitializeFields]; 
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Error in get point response: %@", error); 
}]; 

[operation start]; 

}

я инициализацию внутри InitializeFields и вот код:

self.m_placeName.text = [self.m_pointData objectForKey:@"name"]; 

self.m_placeLocation.text = [self.m_pointData objectForKey:@"city"]; 

NSArray* comments = [self.m_pointData objectForKey:@"comments"]; 

const int commentsCount = [comments count]; 

self.m_commentsCount.text = [NSString stringWithFormat:@"%d", commentsCount]; 

self.m_scrollView.m_address.text = [self.m_pointData objectForKey:@"address"]; 
self.m_scrollView.m_email.text = [self.m_pointData objectForKey:@"email"]; 
self.m_scrollView.m_phone.text = [self.m_pointData objectForKey:@"tel"]; 
self.m_scrollView.m_link.text = [self.m_pointData objectForKey:@"website"]; 

self.m_rightBtn.image = [UIImage imageNamed:@"favorite_star_inactive.png"]; 

только последняя строка - self.m_rightBtn.image = [UIImage imageNamed:@"favorite_star_inactive.png"]; - не работает , Когда я перехожу к viewDidLoad, он работает. Что-то с блоком завершения, но я не знаю, что.

ответ

2

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

dispatch_async(dispatch_get_main_queue(), ^{ 
     //update button 
    }); 

Также рядом предположение, что изображение не инициализируется, когда вы к нему доступ в блоке. Добавить проверку:

if (!self.m_rightBtn.Image) { 
    self.m_rightBtn.Image = [UIImage new]; 
} 
+0

Остальные элементы управления пользовательского интерфейса работают, нет проблем с основной нитью, там работает блок завершения. Что-то не так с изображением элемента кнопки. Тексты ярлыков и т. Д. Работают правильно. –

+0

Вы пробовали проверить ноль? – Roma

+0

Да @ Рома, это не ноль. –

1

UI вещи должны происходить в основном потоке, а не на вторичных потоков (которые могут быть завершающие блоки).

ли материал UI в этом:

dispatch_async(dispatch_get_main_queue(), ^{ 
    // This block will be executed asynchronously on the main thread. 
}); 

и все будет хорошо. Более подробно можно найти in this related question & answer.

+0

Пропущенный, чтобы сказать, что блок завершения для AFNetworking работает в основном потоке, AFNetworking гарантирует, что я также проверил это. –

Смежные вопросы