0

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

4

0 回答 0