Intereting Posts

не может установить заголовок 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 если два объекта в игре имеют шанс вызвать цикл сохранения, например, когда вы захватываете себя в блоке, и этот блок также захватывается самим. Вот еще один ответ для большей ясности