2012-04-03 76 views
0

在我的前同事之後,我正在開展一個項目。該代碼是除了一個很大,從視圖的子視圖調用ViewController的方法?

主控制器

@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]; 
} 

然後,有一個按鈕作爲HeaderBar視圖的子視圖。此按鈕與FirstResponder的方法,這似乎是refreshHeader

代碼工作,因爲他想精綁。但是,即使我是iOS開發新手,我還不太瞭解FirstResponder。我覺得這種設計方法不太合適。

由於該按鈕屬於headerBar的視圖。它應該綁定到headerBar的方法,對吧? (假設headerBar也是一個控制器) 然後,找到一種方法從headerBar向MainController發送數據/結果/消息,而不是直接通過firstResponder發送給MainController。

如果是這樣,我怎麼能從HeaderBar的方法發送數據/結果/消息到MainController的方法之一,而不是使用出現在代碼的其他部分的方法。 (我覺得不好它也它看起來很奇怪。它看起來像,創建兩個控制器之間的關係,以錯誤的方式。)

主控制器

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

我看了一些其他的相關問題,他們大多表示,另一種方法是定義Protocal和代表,這是做這件事的最好方法嗎?這是唯一的方法嗎?而不是兩個控制器相互溝通。

任何建議是值得歡迎的,糾正我的誤解也是值得歡迎的。我將不得不在這個項目上工作好幾個月,只是在五個月的第二階段。所以,我希望儘可能少使用錯誤的設計。

最好的問候

P.S.如果代碼不正確,我很抱歉,它不是實際的代碼。有些東西可能不正確,但希望你們能看到這張照片。

回答

2

是的,這是最好的辦法。它被稱爲委託設計模式。而實際上有兩個控制器相互通信。

我在這裏看到的唯一問題是您在FooterBar中保留MainController。你不應該這樣做,因爲它會導致保留循環,阻止對象被釋放(對象A保留B,而obj B保留A,所以它們的保留數永遠不會爲0)。的

因此而不是(在Footerbar):

@property (nonatomic, strong) MainController *mainController; 

你應該有:

@property (nonatomic, assign) MainController *mainController; 

或更通用的(如果需要的話),你可以創建一個描述了需要的方法的協議代表。然後使MainController實現該協議。

//FooterBar.h 
@protocol FooterBarDelegate <NSObject> 

-(void)aNeededMethod; 

@end 
@interface FooterBar : UIViewController { 

} 

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

- (void)someMethod; 

@end 

然後

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

} 
+0

謝謝,米哈爾。我想,你的回答是問題的第二部分(使用FooterBar),對吧?如果是這樣,那麼第一個呢?我正在考慮按照你的回答重構第一個代碼。 (在HeaderBar中創建和IBAction,然後像你的答案一樣發送給MainViewController) – 2012-04-03 09:20:53

+1

是的,重構將是一個好主意。如果refreshHeader方法只用Header完成這項工作,那麼它應該屬於它。但是,這可能不是必需的。這是你的決定,你必須權衡代碼的簡單性(可讀性)和清晰的類之間的關係。 – 2012-04-03 09:27:26

+0

再次感謝你米迦勒。我一定會去進行代碼重構。這真的需要。這個應用程序在開始時設計不好。在控制這個項目之前,主控制器曾經有1200行代碼。現在,一切似乎都在他們正確的位置,一個接一個。祝你有美好的一天 !! – 2012-04-03 09:39:06

2

可以使用 self.parentViewController 它參考,到ViewController將添加的電流的viewController