Nach Umstellung auf ARC funktionieren Buttons in einer nachträglich mit addSubView erstellten View nicht mehr

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Nach Umstellung auf ARC funktionieren Buttons in einer nachträglich mit addSubView erstellten View nicht mehr

    Hallo!

    Ich habe meine App (Objective-C) auf ARC umgestellt und im Wesentlichen funktioniert es.

    Aber ich habe ein Problem mit einem Eingabedialog mit einem Picker und 2 Buttons, der als Subview mit [self.view addSubview:newView] über den aktiven Dialog gelegt wird.
    Vor der Umstellung lief alles bestens und nun funktioniert zwar der Picker, aber die beiden Buttons werden nicht mehr angesprochen. (Haltepunkt wird nicht erreicht).

    Wenn ich den Dialog über [self presentViewController:animated:completition] modal aufrufe, ist alles wieder ok. Aber dann verdeckt der Dialog die aktuelle Anzeige komplett und das soll nicht sein.
    Daher ist die MainView der Dialogklasse transparent und nur den Datenbereich wird angezeigt.

    Die Deklaration der Dialogklasse:

    Quellcode

    1. @interface FormPicker : UIViewController {
    2. id<PickerDialogProtocoll>pickerDelegate;
    3. }
    4. @property (retain, nonatomic) IBOutlet UIView *mainView;
    5. @property (nonatomic, strong) id<PickerDialogProtocoll>pickerDelegate;
    6. @property (retain, nonatomic) IBOutlet UIView *dataView;
    7. @property (retain, nonatomic) IBOutlet UIDatePicker *picker;
    8. @property (retain, nonatomic) IBOutlet UIButton *btnOK;
    9. @property (retain, nonatomic) IBOutlet UIButton *btnCancel;
    10. - (IBAction)clickOK:(id)sender;
    11. - (IBAction)clickCancel:(id)sender;
    12. -(void)configureModalInputDialogWithDelegate:(id<PickerDialogProtocoll>)aDelegate
    13. useDateFormat:(NSString*)aDateFormat
    14. usePickerMode:(UIDatePickerMode*)aPickerMode
    15. startWithDate:(NSDate*)aStartValue
    16. textOKButton:(NSString*)textOK
    17. textCancelButton:(NSString*)textCancel
    18. withColour:(UIColor*)aColour
    19. withAlpha:(float)aAlpha;
    20. @end
    Alles anzeigen
    Der Aufruf des Dialoges:


    Quellcode

    1. FormPicker* formPicker = [[FormPicker alloc] init];
    2. [formPicker configureModalInputDialogWithDelegate:self
    3. useDateFormat:dateFormat
    4. usePickerMode:pickerMode
    5. startWithDate:date
    6. textOKButton:NSLocalizedString(@"btnSave", nil)
    7. textCancelButton:NSLocalizedString(@"btnCancel", nil)
    8. withColour:[UIColor grayColor]
    9. withAlpha:0.5];
    10. UIView *view = formPicker.view;
    11. CGRect mainrect = [self makeRectForPicker];
    12. view.frame = mainrect;
    13. [self.view addSubview:view];
    14. [self.view setNeedsDisplay];
    Alles anzeigen


    Umgebung:
    XCode 10.1
    OS 10.13.6
    iOS 12.1.2

    Wie komme ich da wieder raus?
  • Du musst eine Referenz auf den ViewController (FormPicker) halten. Da wirst Du ohne ARC dann wohl ein Memory Leak gehabt haben, oder hattest Du vorher irgendwo ein release an den FormPicker ViewController geschickt.

    Du kannst ja mal ein Menu > Product > Analyze bei dem Projekt ausführen. Da sollte dann ggf. noch mehr angezeigt werden, was Probleme verursachen könnte. ;)

    Da Du den View des FromPicker ViewControllers zum view des aktuellen ViewController hinzufügst könntest Du den ViewController auch per addChildViewController: zum ViewController hinzufügen und nach der Verwendung per removeFromParentViewController wieder entfernen.
  • MCDan schrieb:

    Du musst eine Referenz auf den ViewController (FormPicker) halten. Da wirst Du ohne ARC dann wohl ein Memory Leak gehabt haben, oder hattest Du vorher irgendwo ein release an den FormPicker ViewController geschickt.
    Ich habe das über ein Protocol gelöst:

    Quellcode

    1. @protocol PickerDialogProtocoll <NSObject>
    2. -(void)finishedPickerDialog:(FormPicker*)dialog withText:(NSString*)text;
    3. -(void)cancelledPickerDialog:(FormPicker*)dialog ;
    4. @end

    Entfernt habe ich den Picker so:

    Quellcode

    1. -(void)cancelledPickerDialog:(FormPicker*)dialog{
    2. [pickerDialog.view removeFromSuperview];
    3. }


    MCDan schrieb:

    Du kannst ja mal ein Menu > Product > Analyze bei dem Projekt ausführen. Da sollte dann ggf. noch mehr angezeigt werden, was Probleme verursachen könnte.
    Ich habe zwar noch 2 blaue Warnungen, aber die betreffen ganz andere Klassen. Hier beim Problem ist der Analyzer zufrieden :)

    MCDan schrieb:

    Da Du den View des FromPicker ViewControllers zum view des aktuellen ViewController hinzufügst könntest Du den ViewController auch per addChildViewController: zum ViewController hinzufügen und nach der Verwendung per removeFromParentViewController wieder entfernen.
    Das habe ich versucht, aber dann sehe ich gar nichts vom Picker. Vielleicht liegt er irgendwo im Hintergrund...
  • Gibbsnich schrieb:

    Entfernt habe ich den Picker so:

    Quellcode

    1. -(void)cancelledPickerDialog:(FormPicker*)dialog{
    2. [pickerDialog.view removeFromSuperview];
    3. }
    Ja, damit hattest Du zwar den View des Picker ViewControllers entfernt, aber den ViewController als solches nie released. ;)

    Gibbsnich schrieb:

    MCDan schrieb:

    Da Du den View des FromPicker ViewControllers zum view des aktuellen ViewController hinzufügst könntest Du den ViewController auch per addChildViewController: zum ViewController hinzufügen und nach der Verwendung per removeFromParentViewController wieder entfernen.
    Das habe ich versucht, aber dann sehe ich gar nichts vom Picker. Vielleicht liegt er irgendwo im Hintergrund...
    addChildViewController: ist keine Alternative zu [self.view addSubview:view]; sondern sollte zusätzlich verwendet werden. ;)

    Komplett sollte dies dann so aussehen:

    C-Quellcode

    1. ...
    2. FormPicker* formPicker = [[FormPicker alloc] init];
    3. [formPicker configureModalInputDialogWithDelegate:self
    4. useDateFormat:dateFormat
    5. usePickerMode:pickerMode
    6. startWithDate:date
    7. textOKButton:NSLocalizedString(@"btnSave", nil)
    8. textCancelButton:NSLocalizedString(@"btnCancel", nil)
    9. withColour:[UIColor grayColor]
    10. withAlpha:0.5];
    11. UIView *view = formPicker.view;
    12. CGRect mainrect = [self makeRectForPicker];
    13. view.frame = mainrect;
    14. [self.view addSubview:view];
    15. [self.view setNeedsDisplay];
    16. [self addChildViewController:formPicker];
    17. }
    18. -(void)cancelledPickerDialog:(FormPicker*)pickerDialog
    19. {
    20. [pickerDialog.view removeFromSuperview];
    21. [pickerDialog removeFromParentViewController];
    22. }
    Alles anzeigen