通过委托发送控制器对象

时间:2013-06-11 00:40:03

标签: cocoa delegates

我正在尝试使用NSplitView创建一个cocoa应用程序,用于跟踪“活动子视图”(例如终端应用程序如何知道您正在编辑哪个窗格)。

我有一个SessionWindowController,它根据用户最后点击的PaneView跟踪“currentPaneContainerViewController”。

一些类和文件:

SessionWindowController.h/.m 
PaneContainerViewController.h/.m
PaneView.h/.m 
PaneContainerView.xib

PaneContainerView.xib将PaneContainerViewController作为其文件所有者。

我目前的实施如下:

要从NSView访问PaneContainerViewController,我使用引用文件所有者的IBOutlets,并访问SessionWindowController我还维护符合我所做的委托方法的对象的IBOutlet(即,对象碰巧是SessionWindowController)。

#import <Cocoa/Cocoa.h>
#import "PaneViewDelegate.h"
@class PaneContainerViewController;
@class SessionWindowController;

@interface PaneView : NSView
{
    //outlet connection to own controller
    IBOutlet PaneContainerViewController *myPaneContainerViewController;

    //we'll use delegation to get access to the SessionWindowController
    IBOutlet id<PaneViewDelegate> sessionDelegate;
}
@implementation PaneView

-(void)mouseUp:(NSEvent *)event
{
    if (sessionDelegate && [sessionDelegate respondsToSelector:@selector(setCurrentPaneContainerViewController:)]) {
        [sessionDelegate setCurrentPaneContainerViewController:myPaneContainerViewController];
    }
}

这是sessionDelegate所属的类,它符合PaneViewDelegate协议:

@interface SessionWindowController : NSWindowController <PaneViewDelegate>
{
    PaneContainerViewController *currentPaneContainerController;
}
- (void)setCurrentPaneContainerViewController:(PaneContainerViewController*)controller;

我的麻烦是使用IBOutlet访问SessionWindowController对象。在Interface Builder中,我如何连接sessionDelegate插座以便能够访问SessionWindowController实例?此外,是否可以将控制器传递给代理而不是NSEvent?

我是Cocoa的新手,所以如果有更好的设计模式,请告诉我。对于一个非常常见的功能来说,这似乎是很多样板。

0 个答案:

没有答案