Intereting Posts
Изменить размер MaskedLayer над UIView Передача объектов модели из одного контроллера представления в другой в стеке навигации Получить список близлежащих игроков с помощью GameCenter Можно ли отслеживать приложение IOS из загрузки для установки? добавление subviews в представление контента UITableViewCell делает ячейку невыбираемой Swift WKWebView сбой на didFailProvisionalNavigation Перезагрузка памяти CoreData iOS Development – объединение города с NSTimezone в автономном режиме Сбой приложения iOS при отображении клавиатуры Загружать изображение с помощью MTKTextureLoader без перелистывания? Загрузите плейлисты Apple Music из приложения iOS Невозможно изменить исполняемые разрешения для приложения при изменении идентификатора пучка как создавать сертификаты, ключи, .pem и .p12 файл без использования mac для создания ipa? Как установить белый список активности для UIActivityViewController, а не в черный список? Не удалось сохранить операцию iTunes Store, Отсутствует необходимый файл значка

не может установить заголовок UIButton в UITableViewCell с блоком

У меня есть UIButton в пользовательском UITableViewCell , когда я UIButton кнопку, он будет отправлять данные на мой сервер с помощью AFNetworking , в блоке успеха я устанавливаю новый заголовок кнопки, но он не работает. В CutomTableViewCell я использую протокол, поэтому я могу ответить на нажатие кнопки:

 @implementation SubjectReplyCell - (IBAction)btnReplyPressed:(UIButton *)sender { if (self.delegate && [self.delegate respondsToSelector:@selector(postData:atIndex:)]) { [self.delegate postData:self atIndex:sender.tag]; } } @end 

Затем я выполняю делегирование и отправлю данные на сервер:

 @implementation BBSDetailsController - (void)postData:(SubjectReplyCell *)cell atIndex:(NSInteger)idx { urlString = [API_HOST stringByAppendingString:BBS_PRAISE_OPPOSITION]; __weak typeof(SubjectReplyCell) *weakCell = cell; [requestManager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if ([responseObject[@"returnode"] isEqualToString:@"success"]) { //it doesn't work [weakCell.btnReply setTitle:@"newTitle" forState:UIControlStateNormal]; [weakCell setNeedsLayout]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; } 

Но если я установлю заголовок из блока, он хорошо работает:

 - (void)postData:(SubjectReplyCell *)cell atIndex:(NSInteger)idx { urlString = [API_HOST stringByAppendingString:BBS_PRAISE_OPPOSITION]; //it work [cell.btnReply setTitle:@"newTitle" forState:UIControlStateNormal]; [requestManager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { if ([responseObject[@"returnode"] isEqualToString:@"success"]) { } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; } 

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

Вам нужно использовать ключевое слово __block (это два __block подчеркивания), если вы хотите изменить объект внутри блока. Использование __block сообщает компилятору заранее, что вы планируете мутировать объект внутри блока, поэтому относитесь к этому объекту по-разному, чтобы сохранить изменения.

Итак, это:

 __weak typeof(SubjectReplyCell) *weakCell = cell; 

должно быть следующим:

 __block typeof(SubjectReplyCell) *weakCell = cell; 

edit: вам не нужно использовать __weak в своей ячейке, потому что изменение вашей ячейки в этом блоке не должно создавать опорный цикл. В этом случае ваша ячейка будет сохранена в блоке завершения, но ячейка также не сохранит сам блок, поэтому эти два не будут создавать цикл сохранения.

Вы должны использовать __weak если два объекта в игре имеют шанс вызвать цикл сохранения, например, когда вы захватываете себя в блоке, и этот блок также захватывается самим. Вот еще один ответ для большей ясности