我正在尝试使用 NSplitView 制作一个可可应用程序,以跟踪“活动子视图”(例如终端应用程序如何知道您正在编辑哪个窗格)。
我有一个 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 的新手,所以如果有更好的设计模式请告诉我。对于一个非常常见的功能,这看起来确实是很多样板文件。