2012-04-10 6 views
0

Hoffentlich ist das leicht gefallen ...iOS: NSObject Anruf und Erfassen, welche UIViewController callte

Ich habe eine NSObject mit Methoden, die in mehreren UIViewControllers verwendet wird (die NSObject ist in meiner PCH-Datei importiert) .

Die UIViewControllers rufen dann das NSObject wie folgt auf;

[ThisNSObject doSomething];

Das ist alles planen zu arbeiten, so gibt es kein Problem ... aber würde ich die Methode doSomething lieben den Anruf in der Lage sein zu erkennen, welche UIViewController zu diesem NSObject gemacht. Basierend auf diesen Informationen kann ich den UIViewController auf beliebige Weise manipulieren.

Der Grund, warum ich das brauche, ist, weil, wenn ich eine UITabBar mit jeder Registerkarte einen anderen UIViewController laden, aber alle einen Aufruf an die globale NSObject, muss ich weitere Aktion auf diesen einen bestimmten UIViewController leiten.

Ich weiß, ich habe Zugriff auf keyWindow, aber ich bin mir nicht sicher, das ist genau das, wonach ich bin.

Alle Vorschläge wären großartig, danke.

Roy

EDIT: Eigentlich vielleicht in der NSObject kann ich erkennen, welche Register aktuell ausgewählt ist, erhalten dann die oben in dem Stapel ... und machen eine Referenz wie das? Hat jemand Gedanken darüber, warum das eine schlechte Idee wäre?

Antwort

0

Mit Runtime-Code könnten Sie wahrscheinlich durch den Call-Stack zurück bohren, aber es ist eine ziemlich komplexe Lösung für ein einfaches Problem. Ich würde vorschlagen, dass Sie für die Inspiration zu den APIs aussehen und Ihre doSomething Methode ändern, wie dies ein Controller Argument zu nehmen:

-(void) doSomethingWithViewController:(UIViewController *) viewController; 

diese Weise, wenn Sie die doSomething Methode können Sie einen Verweis auf sich selbst wie folgt passieren:

[theObject doSomethingWithViewController:self]; 

Und Ihr Problem ist gelöst - einfach.

P.S. wenn Sie andere Parameter haben ein alternativer Stil könnte

-(void) viewController:(UIViewController *) viewController doSomethingWithX:(id) x; 

ist Es hängt alles davon ab, was den besten für Sie Sinn macht.

+0

Sie haben Recht, ich denke, das ist der beste Ansatz. – roycable

1

Ich bin damit einverstanden Art mit @ Drekka Antwort, aber es hat ein Problem ... der Code Zeile:

- (void) viewController:(UIVIewController*)viewController doSomething; 

ist nicht syntaktisch korrekt. Aber er irgendwie selbst tilgt durch eine andere Lösung setzen, die richtige ist:

- (void) doSomethingWithViewController:(UIViewController*) viewController; 

Eine Alternative, da es nicht, dass die Viewcontroller scheint vorbei als Argument wirklich Sinn in Ihrer Situation macht, ist eine Delegation zu verwenden, um auf Ihre benutzerdefinierte Klasse und lassen Sie die ViewController als Delegat abonnieren.Zum Beispiel:

@protocol MyCustomNSObjectDelegate; 

@interface MyCustomNSObject : NSObject 

@property (nonatomic, assign) id<MyCustomNSObjectDelegate delegate; 

- (void) doSomething; 

@end 

@protocol MyCustomNSObjectDelegate <NSObject> 
@required 
- (void) myCustomNSObject:(MyCustomNSObject*)myObject takeFurtherActionWithData:(NSString*)someData; 
@end 

Dann in Ihrem UIViewController

#import "MyCustomNSObject.h" 

@interface MyUIViewController : UIViewController <MyCustomNSObjectDelegate> 

... 

stellen Sie dann die Delegierten Eigenschaft MyCustomNSObject zum UIViewController, bevor Sie doSomething nennen. Im doSomething Verfahren, nach, wenn beendet „etwas“, am Ende des Verfahrens zu tun hinzufügen:

[self.delegate myCustomNSObject:self takeFurtherActionWithData:@"change this to whatever type you need here"]; 

Hoffnung, das hilft.

+0

Hoppla, lehre mich, Code zu tippen anstatt zu schneiden und einzufügen :-) Wird meine Antwort korrigieren. – drekka

Verwandte Themen