0

ココア タッチでプッシュ/ポップ ビューの UINavigationController のようなココア MAC アプリ開発でビューを交換したいです。プッシュ ビューとポップ ビューのアプリの要件です。どうにかしてこれを達成することができましたが、今はプロジェクトの途中で、ココアで viewWillAppear のようなものが必要です。

4

5 に答える 5

2

参考までに、iOS View ライフサイクル メソッド (viewDidLoad、viewWillAppear、viewDidAppear など) は、OSX 10.10 Yosemite (およびおそらくそれ以降) から利用できます。

注意事項: 10.10 より前の OSX バージョンでアプリケーションを実行する予定がある場合は、以前のバージョンでは認識されないため、そのようなメソッドを実装しないでください (そのため、コードは実行されません)。

于 2015-01-09T14:07:57.453 に答える
1

このような方法は、Mac では使用できません。OSX の UI は、iOS の UI とは大きく異なります。最初の UI 更新に -(void)loadView (または、UI が Interface Builder で設計され、xib ファイルから読み込まれる場合は -(void)awakeFromNib) を使用し、その後、呼び出すたびに、特定のオンデマンド UI 更新要求をプログラムで作成します。 showWindow、makeKeyAndOrderFront、通知の取得、デリゲートからのコールバックの取得など。

于 2012-08-16T13:54:15.740 に答える
1

私はこのようなものを思いついた:

ヘッダ:

@protocol GWViewExtensions <NSObject>
- (void) viewWasAddedToSuperview;
@end

@interface GWView : NSView

//set to the view controller managing this view to get NSResponder udpates,
//and GWViewExtension protocol method calls.
@property (weak,nonatomic) IBOutlet NSViewController * viewController;

@end

実装:

#import "GWView.h"

@implementation GWView

- (void) awakeFromNib {
    [self setNeedsDisplay:TRUE];
}

- (void) addSubview:(NSView *)aView {
    [super addSubview:aView];
    if([aView isMemberOfClass:[GWView class]]) {
        GWView * gview = (GWView *)aView;
        if(gview.viewController && [gview.viewController conformsToProtocol:@protocol(GWViewExtensions)]) {
            if([gview.viewController respondsToSelector:@selector(viewWasAddedToSuperview)]) {
                [gview.viewController performSelectorOnMainThread:@selector(viewWasAddedToSuperview) withObject:nil waitUntilDone:FALSE];
            }
        }
    }
}

- (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(self.viewController) {
        [self.viewController setNextResponder:newNextResponder];
        return;
    }
    [super setNextResponder:newNextResponder];
}

- (void) setBackgroundColor:(NSColor *)backgroundColor {
    _backgroundColor = backgroundColor;
    [self setNeedsDisplay:TRUE];
}

- (void) drawRect:(NSRect) dirtyRect {
    [super drawRect:dirtyRect];
    if(self.backgroundColor) {
        NSGraphicsContext * theContext = [NSGraphicsContext currentContext];
        [theContext saveGraphicsState];
        [[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(0,[self frame].size.height)];
        [self.backgroundColor set];
        NSRectFill([self bounds]);
        [theContext restoreGraphicsState];
    }
}

- (void) dealloc {
    self.backgroundColor = nil;
}

@end

使用する:

#import <Cocoa/Cocoa.h>
#import "GWView.h"

@interface GWDribbbleShotDetailColumn : NSViewController <GWViewExtensions>
@end


#import "GWDribbbleShotDetailColumn.h"

@interface GWDribbbleShotDetailColumn ()
@end

@implementation GWDribbbleShotDetailColumn

- (void) viewWasAddedToSuperview {
    NSRect svb = self.view.superview.bounds;
    NSRect sf = self.view.frame;
    sf.size.height = NSHeight(svb);
    sf.size.width = NSWidth(svb);
    self.view.frame = sf;
}

@end
于 2013-11-02T15:27:40.803 に答える
-1

必要に応じてボタンクリック時にウィンドウにviewControllerを設定するなど、ビューを変更するためにNSViewControllerを使用しましたが、特定のviewControllerに対して(id)initが呼び出されると、同じviewControllerに対して再度呼び出されることはありません。 UI (View / MVC) が更新されません。(id)init を再度強制的に呼び出しましたが、ビューが更新されません。

于 2012-08-17T04:24:09.610 に答える