在我的前同事之後,我正在開展一個項目。該代碼是除了一個很大,從視圖的子視圖調用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.如果代碼不正確,我很抱歉,它不是實際的代碼。有些東西可能不正確,但希望你們能看到這張照片。
謝謝,米哈爾。我想,你的回答是問題的第二部分(使用FooterBar),對吧?如果是這樣,那麼第一個呢?我正在考慮按照你的回答重構第一個代碼。 (在HeaderBar中創建和IBAction,然後像你的答案一樣發送給MainViewController) – 2012-04-03 09:20:53
是的,重構將是一個好主意。如果refreshHeader方法只用Header完成這項工作,那麼它應該屬於它。但是,這可能不是必需的。這是你的決定,你必須權衡代碼的簡單性(可讀性)和清晰的類之間的關係。 – 2012-04-03 09:27:26
再次感謝你米迦勒。我一定會去進行代碼重構。這真的需要。這個應用程序在開始時設計不好。在控制這個項目之前,主控制器曾經有1200行代碼。現在,一切似乎都在他們正確的位置,一個接一個。祝你有美好的一天 !! – 2012-04-03 09:39:06