2016-05-20 5 views
2

UIAlertController происходит сбой с этим сообщением об ошибке:UIAlertController - Захват «контроллер» сильно в этом блоке

Попытка загрузить вид контроллера представления во время его deallocating не допускается и может привести к непредсказуемому поведению (< UIAlertController: 0x7fb9107674d0>)

также с предупреждением брошено пытается захватить TextFields objectAtIndex.

Любые идеи?

Предупреждение .. Захват «контроллера» сильно в этом блоке, вероятно, приведет к розничному циклу.

Я также попытался создать @property (weak) ссылку предупреждение идет прочь, но приложение по-прежнему падает с этим:

-(void)viewWillAppear:(BOOL)animated 
{ 
    // self.controller = [UIAlertController alloc]; 

    UIAlertController* controller = [UIAlertController alertControllerWithTitle:@"Add Alergy To List" message:nil preferredStyle:(UIAlertControllerStyleAlert)]; 
    [controller addTextFieldWithConfigurationHandler:^(UITextField * nametextField) { 
     _nameTextField.text = [controller.textFields objectAtIndex:0].text; 
    }]; 
    UIAlertAction *save = [UIAlertAction actionWithTitle:@"Save Data" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { 
     [self save:nil]; 
    }]; 
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel Action" style:(UIAlertActionStyleCancel) handler:nil]; 
    [controller addAction:save]; 
    [controller addAction:cancel]; 
    [self presentViewController:controller animated:YES completion:nil]; 
} 
+1

что это за строка '_nameTextField.text = [controller.textFields objectAtIndex: 0] .text;' на самом деле здесь, на ваш взгляд? – holex

ответ

1

Добавить
__weak __typeof(UIAlertController) weakController = controller;
перед вашим addTextFieldWithConfigurationhandler:.

Затем вы должны заменить

_nameTextField.text = [controller.textFields objectAtIndex:0].text; 

с

nameTextField.text = [weakController.textFields objectAtIndex:0].text; 

без _.
_ для внутреннего доступа к свойствам. Здесь вы должны обновить поле, указанное в параметре

Дело в том, что вы находитесь в блоке, и если вы хотите получить текст из полей контроллера, вам нужно сделать слабую ссылку на него. Слабый контроллер предотвратит увеличение количества удержаний.

+0

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

2
__weak __typeof(UIAlertController) weakController = controller; 
__weak __typeof(UITextField) weakTextField = _nameTextField; 

[controller addTextFieldWithConfigurationHandler:^(UITextField *nametextField){ 

    // nameTextField is the textField being returned in the block 
    // if you want to use _nameTextField you need to make that weak too 

    nameTextField.text = [weakController.textFields objectAtIndex:0].text; 

    // or 

    weakTextField.text = [weakController.textFields objectAtIndex:0].text; 

}]; 
+0

Это работало на 100%. –

0

Вы пытаетесь загрузить alertcontroller до ViewController выделяется это предупреждение, потому что вы добавляете UIAlertController непосредственно внутри viewWillAppear

Этот метод вызывается перед вид контроллера представления собирается быть добавлено к иерархии представлений

  1. Просто дать некоторое время для просмотра, чтобы получить добавил к т он рассматривает иерархию. Для этого используйте dispatch_after или некоторые другие функции задержки.
  2. Поскольку вы получаете ввод текстового поля внутри блока, вы не можете использовать объявление о силе, поэтому вы должны объявить __weak typeof (UIAlertController) * weakcontroller = controller; перед тем, как войти в блок. Загляните на сайт разработчика яблока here для большего понимания.

Общий модифицированный код приведен bekow:

-(void)viewWillAppear:(BOOL)animated{ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     UIAlertController* controller = [UIAlertController alertControllerWithTitle:@"Add Alergy To List" message:nil preferredStyle:(UIAlertControllerStyleAlert)]; 
     __weak typeof(UIAlertController) *weakcontroller = controller; 
     [controller addTextFieldWithConfigurationHandler:^(UITextField * nametextField) { 
     nametextField.text = [weakcontroller.textFields objectAtIndex:0].text; 
     }]; 
     UIAlertAction *save = [UIAlertAction actionWithTitle:@"Save Data" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { 
     [self save:nil]; 
     }]; 
     UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel Action" style:(UIAlertActionStyleCancel) handler:nil]; 
     [controller addAction:save]; 
     [controller addAction:cancel]; 
     [self presentViewController:controller animated:YES completion:nil]; 
    }); 
} 

Он будет работать без каких-либо проблем.

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