我正在尝试使用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的新手,所以如果有更好的设计模式,请告诉我。对于一个非常常见的功能来说,这似乎是很多样板。