2016-05-20 4 views
2

UIAlertController mit dieser Fehlermeldung abstürzt:UIAlertController - Capturing ‚Controller‘ stark in diesem Block

Der Versuch, die Ansicht eines View-Controller zu laden, während es Aufheben der Zuordnung ist nicht erlaubt und in undefinierten Verhalten führen (< UIAlertController: 0x7fb9107674d0>)

auch mit einer Warnung ausgelöst versucht, die Textfelder objectAtIndex zu erfassen.

Irgendwelche Ideen?

Warnung .. Capturing "Controller" stark in diesem Block wird wahrscheinlich zu einem Einzelhandelszyklus führen.

Ich habe auch versucht, geht die Warnung weg einen @property (weak) Verweis zu erstellen, aber die App stürzt nach wie vor das mit:

-(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

Was ist diese Zeile '_nameTextField.text = [controller.textFields objectAtIndex: 0] .text;' Ist das tatsächlich in Ihrer Ansicht? – holex

Antwort

1


hinzufügen __weak __typeof(UIAlertController) weakController = controller;
vor Ihrem addTextFieldWithConfigurationhandler:.

Dann sollten Sie

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

mit

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

Ohne die _ ersetzen.
_ ist für den internen Zugriff von Eigenschaften. Hier müssen Sie das in Parameter

angegebene Feld aktualisieren. Tatsache ist, dass Sie sich in einem Block befinden und wenn Sie Text von Controller-Feldern erhalten möchten, müssen Sie einen schwachen Verweis darauf machen. Der schwache Controller verhindert die Anzahl der Erhöhungen.

+0

Hallo Leute, vielen Dank für die Hilfe, alle Fehler gingen weg die App stürzte jedoch nicht ab !! verwirrt, warum das NameTextField weiterhin Null anzeigt. –

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

Das hat 100% sehr gut funktioniert. –

0

Sie versuchen alertcontroller zu laden, bevor die Viewcontroller diese Warnung zugeordnet ist, weil Sie UIAlertController hinzufügen direkt in viewWillAppear

Diese Methode vor die Ansicht der aufgerufen wird View-Controller ist über sein zu einer Ansicht Hierarchie hinzugefügt

  1. einfach etwas Zeit geben für Ansicht zu erhalten hinzugefügt t Er Ansicht hierarchy.to tun, dass dispatch_after oder eine andere Verzögerungsfunktion verwenden.
  2. Da Sie Textfield-Eingabe in einem Block erhalten können Sie nicht starke Deklaration verwenden, so müssen Sie __weak typeof (UIAlertController) * weakcontroller = Controller; vor dem Eintritt in den Block.Überprüfen Sie Apple Entwickler Website here für mehr Verständnis.

Insgesamt modifizierten Code ist bekow gegeben:

-(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]; 
    }); 
} 

Es ohne Probleme funktionieren.

Verwandte Themen