3 Stimmen

Delegate funktioniert nicht, wenn ein modal präsentierter NavigationController verwendet wird ( iOS 5 - Storyboard )

Ich habe ein Problem mit einem Protokoll.

Mein "initialer View Controller" ist ein Navigationscontroller. Auf der Root-Seite zeige ich einen anderen Navigation-Controller, in dem View-Controller eingebettet ist. onclick eine Segue sollte ausgelöst werden... das funktioniert perfekt, aber die Delegate-Methode aus dem "ViewController" wird nie aufgerufen.

Das Bild, das ich hinzugefügt habe, ist ein Beispiel, wie ich die Verbindung zwischen den 2 NavigationControllern mit dem InterfaceBuilder in iOS 5 aufbaue.

image

MyViewController.h

@protocol MyProtocol <NSObject>

@required
- (void) myFunction:(NSString *)string;

@end

@interface MyViewController : UIViewController <MyProtocol>

@property (nonatomic, assign) id<MyProtocol> delegate;

@end

MyViewController.m

#import "MyViewController.h"
@implementation PropertyController
@synthesize delegate = _delegate;

- (void) myFunction:(NSString *)string {
    [_delegate myFunction:string];
}

- (IBAction) callDelegate:(id)sender {
     ![enter image description here][1][self myFunction:@"test"];
}

Und dies ist der Code für den ViewController, der den NavigationController von oben zeigt

ViewController.h

#import "MyViewController.h"

@interface ViewController : UIViewController <MyProtocol>

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void) myFunction:(NSString *)string {
    NSLog(@"myFunction was called");
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [((MyViewController *) segue.destinationViewController) setDelegate:self];
}

- (IBAction) showModalNavigationController {
    [self performSegueWithIdentifier:@"NameFromSegueInInterfaceBuilder" sender:self];
}

Ich kann keine Lösung für mein Problem finden.

Ich hoffe, jemand kann mir helfen

danke :)

1voto

Mike Mertsock Punkte 11600

Ich sehe hier einige Probleme:

  1. In Ihrem Storyboard-Screenshot haben Sie einen zweiten Navigationscontroller. Sie sollten Ihren PropertyController nicht in einen Navigationscontroller einbetten müssen. Lassen Sie stattdessen den Root-View-Controller direkt auf den PropertyController übergehen. Wenn Sie aus irgendeinem Grund diesen Navigationscontroller benötigen, dann müssen Sie Ihren prepareForSegue Umsetzung oben, denn segue.destinationViewController weist in diesem Fall auf die UINavigationController . Sie müssen also das Nav-Controller-Objekt abrufen und dann setDelegate zum rootViewController dieses Nav-Controller-Objekts. Aber auch hier nur, wenn Sie sich entscheiden, den Navigationscontroller zu behalten.
  2. Wie funktioniert MyViewController beziehen sich auf Ihre ViewController y PropertyController Klassen? Die PropertyController Klasse (oder eine Oberklasse) muss die @property y synthesize Anweisungen für die delegate Eigentum.

0voto

Ich habe mit dem gleichen Problem, damit es funktioniert, fand ich eine Arbeit rund um die Xcode nicht wirklich mag, aber es funktioniert immer noch obwohl --> Einstellung Ihrer Delegaten, wie Sie es tun, macht Ihre Navigation Controller haben Ihre Ansicht als Delegaten, wenn Sie NSLog self.delegate in Ihrem Ziel-Controller wird es Null sein. Um dies zu verhindern -->

self.delegate = self.navigationController.delegate; 

in Ihrem Ziel-Controller (viewdidload), erhält er die Delegation, die Sie im Navigations-Controller erstellt haben, und ermöglicht Ihnen, sie in Ihrem Ziel-Controller zu verwenden

Es ist schmutzig, aber es ist der einzige Weg, den ich gefunden habe. Ich hoffe, es hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X