2012-04-03 9 views
0

Ich arbeite an einem Projekt nach meinem Ex-Kollegen. Der Code war großartig mit einer Ausnahme,Aufruf der ViewController-Methode aus der Untersicht ihrer Sicht?

Haupt-Controller

@interface MainController : UIViewController { 

} 

@property (nonatomic, strong) IBOutlet HeaderBar *headerBar; 

- (void)setup; 
- (IBAction)refreshHeader; 

@end 


@implementation MainController 

- (void)setup{ 
    HeaderBar *hb = [[HeaderBar alloc] initWithNibNames:@"HeaderBar"]; 
    self.headerBar = hb; 
} 

- (IBAction)refreshHeader { 
    //Do something with headerBar's properties 
    //For example, [self.headerBar someiVar]; 
} 

Dann gibt es einen Knopf als Subview HeaderBar Ansicht. Dieser Button wurde gebunden mit FirstResponder Methode, die refreshHeader

Der Code funktioniert gut, wie er wollte zu sein scheint. Aber selbst ich bin neu in iOS Entwicklung und ich verstehe den FirstResponder noch nicht ganz. Ich fühle mich mit diesem Designansatz nicht richtig.

Da diese Schaltfläche zur Ansicht von headerBar gehört. Es sollte an die Methode von headerBar gebunden sein, oder? (angenommen, dass headerBar auch ein Controller ist) Dann finden Sie eine Möglichkeit, eine Daten/Ergebnis/Nachricht von HeaderBar an MainController zu senden, anstatt es direkt an MainController mit FirstResponder zu senden.

Wenn das so ist, wie könnte ich Daten/Ergebnis/Nachricht an eine Methode von MainController aus einer HeaderBar-Methode senden, anstatt den Ansatz, der in anderen Teil des Codes erscheint. (Was ich darüber nicht ein gutes Gefühl zu, es sieht seltsam. Es sieht so aus, eine Beziehung zwischen zwei Controller erstellen, in einer falschen Weise.)

Haupt-Controller

- (void)anotherSetup{ 
    FooterBar *fb = [[FooterBar alloc] initWithNibNames:@"FooterBar"]; 
    fb.mainController = self; 
    self.footerBar = fb; 
} 

FooterBar

#import "MainController.h" 

@interface FooterBar : UIViewController { 

} 

@property (nonatomic, strong) MainController *mainController; 

- (void)someMethod; 

@end 

@implementation FooterBar 
@synthesize mainController; 

- (void)someMethod { 
    [self.mainController someMainControllerMethod]; 
} 

las ich einige andere Fragen, sagte, die meisten von ihnen, dass der andere Ansatz Protocal und Delegierter zu definieren ist, Ist es der beste Weg, dies zu tun? Ist es der einzige Weg? Anstatt zwei Controller miteinander zu kommunizieren.

Jeder Vorschlag ist willkommen, richtig mein Missverständnis ist auch willkommen. Ich werde monatelang an diesem Projekt arbeiten müssen und das erst in der zweiten Phase von fünf. Also, ich würde gerne ein möglichst falsches Design haben.

Mit freundlichen Grüßen

P.S. Es tut mir leid, wenn der Code nicht korrekt ist, es ist nicht der eigentliche Code. Etwas mag nicht stimmen, aber hoffe, ihr könnt das Bild sehen.

Antwort

2

Ja, das ist der beste Weg, es zu tun. Es heißt Delegations Design Pattern. Und das bedeutet, dass zwei Controller miteinander kommunizieren.

Das einzige Problem, das ich hier sehe, ist, dass Sie den MainController in FooterBar behalten. Sie sollten dies nicht tun, da dies zu einem Retain-Zyklus führt, der die Freigabe von Objekten blockiert (Objekt A behält B bei, und Obj B behält A, so dass deren Anzahl nicht 0 ist).

Also statt (bei Footerbar) aufweist:

@property (nonatomic, strong) MainController *mainController; 

sollten Sie haben:

@property (nonatomic, assign) MainController *mainController; 

oder mehr generisch zu sein (falls erforderlich), können Sie ein Protokoll beschreibt, benötigt Methoden erstellen können delegieren. Und dann sollte MainController dieses Protokoll implementieren.

//FooterBar.h 
@protocol FooterBarDelegate <NSObject> 

-(void)aNeededMethod; 

@end 
@interface FooterBar : UIViewController { 

} 

@property (nonatomic, assign) id<FooterBarDelegate> mainController; 

- (void)someMethod; 

@end 

und dann

//MainController.h 
#import "FooterBar.h" 
@interface MainController : UIViewController <FooterBarDelegate> { 

} 
+0

Danke, Michal hinzugefügt. Ich denke, deine Antwort war für den zweiten Teil der Frage (mit FooterBar), richtig? Wenn das so ist, was ist mit dem ersten? Ich denke darüber nach, den Code des ersten umzugestalten, indem ich deiner Antwort folge. (Erstellen und IBAction in HeaderBar und dann senden Sie es wie Ihre Antwort an MainViewController) –

+1

Ja, Refactoring wäre eine gute Idee. Wenn die refreshHeader-Methode nur den Job mit Header ausführt, sollte dieser dazugehören. Es könnte jedoch nicht notwendig sein. Es ist Ihre Entscheidung, Sie müssen den Code Einfachheit (Lesbarkeit) gewichten und klare Beziehungen zwischen den Klassen. –

+0

Danke nochmal Michal. Ich werde definitiv Code-Refactoring machen. Es muss wirklich sein. Diese Anwendung wurde am Anfang nicht gut entworfen. Der Hauptcontroller hatte 1200 Zeilen Code, bevor ich die Kontrolle über dieses Projekt übernahm. Jetzt scheint alles an ihrem richtigen Platz zu sein, eins nach dem anderen. Ich wünsche ihnen einen wunderbaren Tag !! –

2

können Sie verwenden self.parentViewController es dem Viewcontroller refere, dass die aktuelle Viewcontroller

Verwandte Themen