6

私はiOSのプログラミングに慣れており、に非常に慣れていUIViewControllerます。今、私はOSXアプリケーションを作成していて、ベストプラクティスに関するいくつかの一般的な質問があります。

UIViewController私は通常、メソッドでビューを設定します-本当に必要な場合を除いて-(void)viewDidLoad、実際にはカスタムUIViewを作成しません-したがって、ビューを独自のビューに追加、削除、アニメーション化などします-まず、良い習慣です?UIViewControllerUIViewController

そして私の主な質問-OSXのベストプラクティスは何ですか?私はプログラムでインターフェースを作成するのが好きで、単にその方法を好みます。私の場合、新しいカスタムウィンドウを作成し、そのビューを管理したいとします。それを行うための最良の方法は何ですか、そしてユーザーインターフェイスをどこで最もよくインスタンス化するのですか?

概要:プログラムでカスタムビューを作成し、OSXでビューとコントローラーの間にベストプラクティスの関係を設定するにはどうすればよいですか?また、ビューコントローラを使用してビュー内にビューを作成することは良い習慣と見なされますか?

敬具

4

2 に答える 2

8

NSViewControllerのコードでビューを作成するには、loadViewをオーバーライドし、必ずビュー変数を設定してください。NSViewControllerのnibNameプロパティとnibBundleプロパティからnibを読み込もうとするため、superの実装を呼び出さないでください。

-(void)loadView
{
    self.view = [[NSView alloc] init];
    //Add buttons, fields, tables, whatnot
}

NSWindowControllerの場合、手順は非常に似ています。loadWindowの実装の最後にwindowDidLoadを呼び出す必要があります。また、ウィンドウがnilの場合、ウィンドウコントローラはloadWindowを呼び出さないため、init中に呼び出す必要があります。NSWindowControllerは、ペン先からロードする場合を除いて、コントローラーを作成する前にコードでウィンドウを作成することを想定しているようです。

- (id)initWithDocument:(FFDocument *)document
                   url:(NSURL *)url
{
    self = [super init];
    if (self)
    {
        [self loadWindow];
    }

    return self;
}    
- (void)loadWindow
{
    self.window = [[NSWindow alloc] init];
    //Content view comes from a view controller
    MyViewController * viewController = [[MyViewController alloc] init];
    [self.window setContentView:viewController.view];
    //Your viewController variable is about to go out of scope at this point. You may want to create a property in the WindowController to store it.
    [self windowDidLoad];
}

いくつかのオプションの空想(10.9以前)

10.10より前は、NSViewControllersはOSXの最初のレスポンダーチェーンに含まれていませんでした。アイテムがレスポンダーチェーンに存在する場合、メニューは自動的にメニューアイテムを有効/無効にします。NSViewControllerプロパティを使用してNSViewの独自のサブクラスを作成し、コントローラーをレスポンダーチェーンに追加できるようにすることができます。

-(void)setViewController:(NSViewController *)newController
{
    if (viewController)
    {
        NSResponder *controllerNextResponder = [viewController nextResponder];
        [super setNextResponder:controllerNextResponder];
        [viewController setNextResponder:nil];
    }

    viewController = newController;

    if (newController)
    {
        NSResponder *ownNextResponder = [self nextResponder];
        [super setNextResponder: viewController];
        [viewController setNextResponder:ownNextResponder];
    }
}

- (void)setNextResponder:(NSResponder *)newNextResponder
{
    if (viewController)
    {
        [viewController setNextResponder:newNextResponder];
        return;
    }

    [super setNextResponder:newNextResponder];
}

最後に、カスタムビューを使用するときに、setViewをオーバーライドするカスタムNSViewControllerを使用して、viewControllerプロパティを設定します。

-(void)setView:(NSView *)view
{
    [super setView:view];
    SEL setViewController = @selector(setViewController:);
    if ([view respondsToSelector:setViewController])
    {
        [view performSelector:setViewController withObject:self];
    }
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}
于 2013-01-26T21:27:27.850 に答える
0

そして私の主な質問-OSXのベストプラクティスは何ですか?私はプログラムでインターフェースを作成するのが好きで、単にその方法を好みます。私の場合、新しいカスタムウィンドウを作成し、そのビューを管理したいとします。それを行うための最良の方法は何ですか、そしてユーザーインターフェイスをどこで最もよくインスタンス化するのですか?

これらはすべてとで行われ awakeFromNibますinit

次のコードは、多くのウィンドウを作成し、それらを配列に格納しています。ウィンドウごとにビューを追加できます。また、各ビューには、必要なすべてのコントロールが含まれている場合があります。

self.myWindow= [[NSWindow alloc] initWithContentRect:NSMakeRect(100,100,300,300)
                                                   styleMask:NSTitledWindowMask
                                                     backing:NSBackingStoreBuffered
                                                       defer:NO];


[self.myWindowArray addObject:self.myWindow];

for (NSWindow *win in self.myWindowArray) {
    [win makeKeyAndOrderFront:nil];
}
于 2013-01-26T19:18:55.130 に答える