ビューコントローラーの通常のinitメッセージを使用してビューを割り当てると、作成されたビューは私のビューではありませんが、デフォルトのNIB名を使用すると機能します。
具体的には、このコードは常に機能します。nib ファイルで定義されたビューを作成し、parentView に表示します。
+ (void)createTransparentViewCenteredInView:(NSView*)parentView withText:(NSString*)text duration:(NSTimeInterval)duration {
TransparentAccessoryViewController* controller = [[TransparentAccessoryViewController alloc] initWithNibName:@"TransparentAccessoryViewController" bundle:nil];
NSLog(@"%@", [controller.view class]); // Returns "TransparentAccessoryView" -- CORRECT
[parentView addSubview:controller.view];
}
ただし、次のコードは時々機能します (常に失敗するとは限らないという点で奇妙です)。一部のparentViewでは、完全に正常に機能し、他のものでは機能しません。親ビューはランダムなカスタム NSView です。
+ (void)createTransparentViewCenteredInView:(NSView*)parentView withText:(NSString*)text duration:(NSTimeInterval)duration {
TransparentAccessoryViewController* controller = [TransparentAccessoryViewController new];
NSLog(@"%@", [controller.view class]); // Returns "NSSplitView" -- INCORRECT
[parentView addSubview:controller.view];
}
表示されるエラーは次のとおりです (ここに NSTableView がまったくないため、なぜ NSTableView が表示されるのかわかりません。また、表示される型がNSSplitView):
2013-04-07 21:33:12.384 アクションの更新に接続できませんでした: クラス TransparentAccessoryViewController のターゲットに
2013-04-07 21:33:12.384 アクション remove: をクラス TransparentAccessoryViewController のターゲットに接続できませんでした
2013-04-07 21:33:12.385 *不正な NSTableView データ ソース ()。numberOfRowsInTableView: および tableView:objectValueForTableColumn:row: を実装する必要があります。
NIB ファイルは、TransparentAccessoryView と呼ばれるカスタムのサブクラス化された NSView を定義し、これをファイル所有者のビュー プロパティである標準的なものに接続します (カスタム クラス名を TransparentAccessoryView に変更しただけです)。何が起こっているのかを確認するために NSLog を追加しましたが、何らかの理由で、2 番目のケースでは、ビュー クラス タイプが正しくなく、何らかの理由で NSSplitView であると考えています。ViewController クラスは次のとおりです。
@implementation TransparentAccessoryViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Initialization code here.
}
return self;
}
- (void)awakeFromNib {
self.textField.stringValue = @"";
}
+ (void)createTransparentViewCenteredInView:(NSView*)parentView withText:(NSString*)text duration:(NSTimeInterval)duration {
TransparentAccessoryViewController* controller = [[TransparentAccessoryViewController alloc] initWithNibName:@"TransparentAccessoryViewController" bundle:nil];
NSLog(@"%@", [controller.view class]);
[parentView addSubview:controller.view];
}
@end
デフォルトの init メッセージは、viewcontroller にちなんで名付けられた NIB をロードするように viewcontroller をトリガーすると考えました。
この動作がまったく発生している理由を誰かが知っていますか?