我在前同事之后正在开展一个项目。代码很棒,除了一个,
主要控制器
@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和Delegate ,这是最好的方法吗?这是唯一的方法吗?而不是两个控制器相互通信。
欢迎任何建议,也欢迎我的误解。我将不得不在这个项目上工作数月,而且只是在五年级的第二阶段。所以,我希望尽可能减少错误的设计。
最好的问候
P.S。如果代码不正确,我很抱歉,这不是实际的代码。有些东西可能不正确,但是,希望你们能看到图片。
答案 0 :(得分: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> {
}
答案 1 :(得分:2)
self.parentViewController
它指的是添加了当前viewController的viewController