从视图的子视图中调用ViewController的方法?

时间:2012-04-03 08:49:59

标签: objective-c ios ios4

我在前同事之后正在开展一个项目。代码很棒,除了一个,

主要控制器

@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。如果代码不正确,我很抱歉,这不是实际的代码。有些东西可能不正确,但是,希望你们能看到图片。

2 个答案:

答案 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