Cocoa objective-cのNSNibについて

このQ&Aのポイント
  • Cocoa objective-cのNSNibについての質問にお答えします。
  • MainManu.nib以外のファイルからウインドウをインスタンス化する方法について、ご説明します。
  • NSNibを使用してウインドウをインスタンス化する際に起きる問題について、解決策をご提案します。
回答を見る
  • ベストアンサー

Cocoa objective-cのNSNibについて

教えていただきたいことがあります。 MainManu.nibとは別ファイルで保存したウインドウをインスタンス化したいのですが、 NSNib *nib = [[NSNib alloc] initWithNibNamed:@"MainMenu"bundle:[NSBundle mainBundle]]; を実行した後、 NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:1]; [nib instantiateNibWithOwner:self topLevelObjects:&muArray]; をしてみたのですが駄目でした。 どのようにすればよいでしょうか? すみません。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yukimican
  • ベストアンサー率70% (112/159)
回答No.1

NSBundleのloadNibNamed: owner:を使ってみてください。 使い方は参考URLや、Google等での検索結果を参考にしてください。

参考URL:
http://www.macmacmac.mydns.jp/modules/tinyd0/index.php?id=14
psychesine
質問者

お礼

ありがとうございます

関連するQ&A

  • Objective-C, Cocoaアプリ

    こんにちわ。初歩的な質問ですが、Objective-C, Cocoa Application両方とも初心者です。ボボタンを押すことで、NSTableViewに新しいデータを追加したいのですが、 デバッグして、データ自体はちゃんとデータソースの方に追加されているのですが、TableViewが表示していないようです。 reloadData, setNeedsDisplayも両方ためしたのですが、表示されません。 ちなみに、新しいデータを追加する関数ですが、tableViewがロードされる前にコールしたときはちゃんと新しいデータがtableViewに表示されています。 コードです。 ****************** dataはNSMutableArrayでItemInfoというクラスのArrayです。(ItemInfoは単純にNSString* nameとint priceの2つのデータを持っているクラスです。) この関数はすべてNSViewControllerのメンバ関数です。 -------コード---------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if(self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]){ data = [[NSMutableArray alloc]initWithCapacity:5]; [data addObject:[[ItemInfo alloc]initWithName:@"Item1" price:100]]; [self addNewItem:nil]; //ここでのaddNewItemは反映され、TableViewには合計2つのデータが表示されています。 } return self; } -(IBAction)addNewItem:(id)sender { //ここはボタンを押したときにちゃんと実行されているのを確認しています。 //実際にdataにも新しいデータが追加されていることをデバッガで確認済みです。 ItemInfo *newItem = [[ItemInfo alloc]initWithName:@"NewItem" price:300]; [data addObject: newItem]; [tableView reloadData]; } #pragma mark - #pragma mark Table View Datasource - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [data count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { //tableView には2つのColumnがあり、一つ目はItemInfo内のnameを、2つ目にはpriceを表示しています。 if([aTableColumn.identifier isEqual:@"Item"]){ return [[data objectAtIndex:rowIndex] name]; }else if([aTableColumn.identifier isEqual:@"Price"]){ return [NSString stringWithFormat:@"%d", [[data objectAtIndex:rowIndex] price]]; } return nil; } ------コード終わり------ 開発環境は以下の通りです。 OS: MacOSX10.6 SnowLeopard Xcode Version3.2.4 Cocoa Application

  • [objective-C]配列について

    はじめまして。 objective-C、cocos2dについての質問です。 iPhoneアプリを勉強しながら作り始めたのですが詰まってしまい、できればご助力をお願いしたいと思い質問させていただきました。 cocos2dというフレームワークを使用し簡単なRPGを作りたいと考えております。 そこでキャラクターのステータスを配列に格納し、どのシーンからも参照したいのですが、どうしてもうまくいきません。 別クラスでインスタンス変数を作り、それを利用して配列を作成する方法で実装しようとしており、実際のコードは以下の通りになります。 ---------------------------------- <Character.h> @interface Character : NSObject{ NSInteger characterStateAtk_; ・(Def、Hpなど) ・ } @property (nonatomic, assign) NSInteger characterStateAtk;  ・  ・ @end <Character.m> #import "Character.h" @implementation Character @synthesize characterStateAtk = characterStateAtk_;  ・  ・ @end キャラクターステータス生成部分 <CreateScene.h> @interface CreateScene : CCScene { NSMutableArray* characterStateArray_; } @property (nonatomic, assign) NSMutableArray *characterStateArray; @end <CreateScene.m> @interface CreateScene() - (void) pressReloadButton:(id)sender; - (void) createCharacterState; @end @implementation CreateScene @synthesize characterStateArray = characterStateArray_; - (void) dealloc{ [self.characterStateArray release]; [super dealloc]; } - (void) createCharacterState{ self.characterStateArray = [NSMutableArray array]; Character* priState = [[[Character alloc]init] autorelease]; priState.characterStateAtk = random() % 5 + 5; ・ ・ [self.characterStateArray addObject:priState]; } (その他の処理) - (void) pressReloadButton:(id)sender{ [self createCharacterState];  (ここでcharacterStateArrayを取得して表示したい) } ---------------------------------- 最初は、 NSInteger x; x = [[self.characterStateArray objectAtIndex:0]intValue]; で取得しようとしたのですがエラーとなり実行できませんでした。 (調べていくうちにobjective-Cでは配列の中身はオブジェクトしか使えないという事を知りました) プログラム中の(ここでcharacterStateArrayを取得して表示したい)の部分について、実装方法や考え方についてご助言をいただけないでしょうか? よろしくお願いいたします。

  • テーブルビューで配列が自動消滅することについて

    xcode4.1をつかってiphoneアプリを作成しています。 テーブルビューの画面遷移時に、 可変配列NSMutableArrayに plistを読み込ませたNSMutableDictionaryの一意のキーの中身を保存し、 更に選択した行番号で呼び出した配列の中身を別ビューに渡そうとすると失敗してしまいます。 ・・自動解放されてしまっていると思うのですが、 [[[NSMutableArray alloc] init] retain]; としてもうまくいきませんでした。 どうすればうまくデータを別ビューに渡せるでしょうか。 (plistの読み込みは必須です。。) すみませんがご教授いただけますでしょうか。。。 よろしくお願いいたします。 //-------- .h------ @interface DtlVCL : UITableViewController { //別のViewからデータ受け渡し用 NSString *rcvStr; //plist一時読み込み用 NSMutableDictionary *dic; NSMutableArray *ary; } .m------------ viewDidLoad------ //各変数初期化 ary = [[[NSMutableArray alloc] init] retain]; dic = [[[NSMutableDictionary alloc] init] retain]; id path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xxxxxxxx.plist"]; if([[NSFileManager defaultManager] fileExistsAtPath:path] == YES){ dic = [NSMutableDictionary dictionaryWithContentsOfFile:path]; }else{ NSLog(@"Dtl :ファイル読み込みエラー"); } ary = [dic objectForKey:rcvStr];//rcvStrは前ビューから取得した文字列 ------------------- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath------ ExpVCL *expvcl = [[ExpVCL alloc] initWithNibName:@"ExpVCL" bundle:nil]; //データの受け渡し expvcl.rcvNum = [indexPath row]; expvcl.rcvStr = [NSString stringWithFormat:@"%@",[ary objectAtIndex:[indexPath row]]]; [self.navigationController pushViewController:expvcl animated:YES]; [expvcl release];

  • [objective-c]他クラスのメソッドを呼ぶ

    objecive-cを使ってアプリを作っているのですが、 iphoneアプリの開発初心者です。 action.mファイルで指定しているボタンのアクションのところで、 kekka.mのファイルに書いているメソッドを実行させたいのですが、 他クラスのメソッドの実行方法が分かりません。 [インスタンス メソッド名]; で実行できるということは何となく分かったのですが、 どれがインスタンスに当たるのかが不明で、質問しました。 action.mに書いたメソッド ------------------- //次へのボタンが押されたときの処理 - (IBAction)kaisetsu:(id)sender { //kekka.mの- (void)showNextメソッドを呼び出したい。 [★ここの書き方が分かりません★]; kekka *viewController = [[kekka alloc] initWithNibName:@"kekka" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; [navigationController setNavigationBarHidden:YES animated:YES]; //モーダルビューとして、次のビューを表示する [self presentModalViewController:navigationController animated:YES]; } ------------------- kekka.mに書いているメソッド ------------------------ // 結果を表示する - (void)showNext { // 結果情報を取得する QuizItem *item = [self.quiz nextQuiz]; self.questionTextView.text = item.question; //読み込んで追加========================= NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults]; NSString *kaisetsutext; kaisetsutext = [_userDefaults stringForKey:@"kaisetsutext"]; //読み込み kaisetsutext = item.kaisetsu; [_userDefaults setObject:kaisetsutext forKey:@"kaisetsutext"]; [_userDefaults synchronize]; //読み込んで追加========================= } お手数ですが、ご教授いただけましたら幸いです。

  • MacのCocoaプログラミングについての質問です

    Cocoaでメインのウィンドウと環境設定のウィンドウを作りたいのですが、 二つの方法を探し当てました。 1.環境設定の為のクラスを用意し、コントローラーがないnibファイルを   initのNSBundleのloadNibNamed:で読み込みウィンドウを作成する。 2.コントローラーがあるnibファイルをメインのウィンドウから   loadNibNamed:で読み込み、ウィンドウを作成する。 1の方法だとコントローラーがないため、テーブルビュー等が 使えません。(私の力不足?) 2の方法の場合、環境設定のウィンドウからメインのウィンドウの 変数にアクセスできない(?)為、不便です。 何か良い方法は無いでしょうか?? どなたかご教示、よろしくお願い致します。m(_ _)m

  • objective-cで困っています。

    objective-cをトライ&エラーで試しながら学習しているのですが、 下記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。 現在tml5のcanvasを使ってお絵描きアプリを作りました。このcanvasに書き込んだデータをiPhoneのカメラロールに保存することをトライしています。いろいろ調べてみると「HTML5 CANVASの描画内容をUIImage経由でカメラロールに保存する」という記事をみつけました。http://lab.spec5zigen.com/archives/html5-canvasの描画内容をuiimage経由でカメラロールに保存する/ その記事を参考に #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // UIWebViewのインスタンス化 CGRect rect = self.view.frame; UIWebView *webView = [[UIWebView alloc]initWithFrame:rect]; // Webページの大きさを自動的に画面にフィットさせる webView.scalesPageToFit = YES; // デリゲートを指定 webView.delegate = self; // URLを指定 NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxxxxxxxxxxxxx"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // リクエストを投げる [webView loadRequest:request]; // UIWebViewのインスタンスをビューに追加 [self.view addSubview:webView]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ return YES; } NSString * requestString = [[request URL] absoluteString]; NSArray *params = [requestString componentsSeparatedByString:@"data:image/png;base64,"]; // dataFromBase64String // NSData+Base64 Copyright 2009 Matt Gallagher. All rights reserved. // http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];//decode base64 to NSData UIImage *image = [UIImage imageWithData:decodedData]; UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//カメラロールに保存 return NO; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end としてみたのですが、 if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ の行にExpected identifierというエラーが、 NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];の行にNo known class method for selector 'dataFromBase64String:'というエラーが という状況で詰っている状況です。 メソッドの定義や宣言されていないメソッドを使っているなどのエラーということを調べて分かったのですが、objective-cを始めたばかりで初歩的なミスかも知れませんがエラーの対応の仕方がまだまだよくわかっていません。 スキーマなど参考にしたサイトの内容も十分に理解しているのではないのですが、「sp5canvas2app」の部分は自由に変えていいのでしょうか? 解決の仕方を教えていただけないでしょうか? 宜しくお願いします。

  • Objective-CでNSStringを複製

    ユーザが入力した文字列を、プログラムの内部データとして保持したいと考えています。 そこで、TextFieldを用意し、そこへ入力した文字を一旦別のクラスのメンバへ複製しようとしています。 保持するクラスにこんなメソッドを用意しました。 -(void) SetText( NSString* para) {   member = [[NSString alloc] initWiithString : para ]; } para で渡された文字列と同じ内容のインスタンスを生成して member で保持しようとしたわけです。 しかし、デバッガでstep実行すると、 member には para と同じアドレスが代入されます。 alloc と言っているので、C++ のnew のような動き(別インスタンスを生成)をイメージをしていたのですが、代入演算子と同じ動きをしていました。 そのため、para が release されてしまうと、この member から文字列を取り出せなくなってしまいます。 (解放済みオブジェクトにアクセスするので例外になります。当然ですけど) このほかには member = para; [member retain] とか、 member = [para copy]; などを試しましたが、いずれも一緒でした。 理由がわかる方、いらっしゃいましたら教えてください。 また、要は textFieldの文字列を別のviewに引き継ぐために、textField がrelease される前に保持したいのですけど、他に有効な方法を教えて頂けたら幸いです。

  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

  • objective-C のOCR認識のサンプル

    http://blog.isana.net/2014/08/ios.html 上記サイトのサンプルコードをそのままコピーしたのですが、以下のエラーが出てしまうのですがなぜでしょうか。 No visible @interface for "UIView" declares the selector "setImage" 下記コードの、// イメージビューに画像をセットとコメントしてある部分です。回答をお願いします // 中略 // カメラボタン押下 - (IBAction)tappedCamera:(id)sender { UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; // デリゲート指定 [imagePickerController setDelegate:self]; // トリミング指定 [imagePickerController setAllowsEditing:YES]; // カメラの使用有無を確認 if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) { // カメラを指定 [imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera]; } else { // アルバムを指定 [imagePickerController setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; } // コントローラ起動 [self presentViewController:imagePickerController animated:YES completion:nil]; } // コントローラ終了 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // イメージをメモリに保存 self.selectedImage = [info objectForKey:UIImagePickerControllerEditedImage]; // イメージビューに画像をセット [self.imageView setImage:self.selectedImage]; // 親ビューへ戻る [self dismissViewControllerAnimated:YES completion:nil]; // テキストを空に [self.textView setText:nil]; // インジケータ開始 UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; spinner.center = CGPointMake(160, 240); spinner.hidesWhenStopped = YES; [self.view addSubview:spinner]; [spinner startAnimating]; // OCR実行 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 英語 : eng を設定 (日本語の場合は jpn を指定) Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:@"eng"]; // OCRを実行する画像を設定 [tesseract setImage:self.selectedImage]; // OCR実行 [tesseract recognize]; // 実行結果をアラートビューで表示 dispatch_async(dispatch_get_main_queue(), ^{ // 結果をテキストビューに指定 [self.textView setText:[tesseract recognizedText]]; // インジケータ停止 [spinner stopAnimating]; }); }); }

  • Objective-Cクラス変数インスタンス変数

    現在iPhoneアプリを作成するために、Objective-Cの勉強をしています。しかしそこでわからないことがあり、質問させていただきました。 それは私がインスタンス変数(メンバ変数)を宣言してつかっているつもりなのですが、クラス変数の様な動きをするのです。 具体的にコードで説明します。 @implementation Main : NSObject - (void)hello{ [[Hoge alloc]init]; [[Hoge alloc]init]; } @end @implementation Hoge : NSObject NSNumber *i; - (id)init{ [super init]; NSLog(@"%d",i.intvalue); i = [NSNumber numberWithInt:123]; return self; } @end 出力結果 null 123 今手元にソースがないので正確ではないかもしれませんが、こんな感じです。hファイルにはとくになにもかいてません。 このソースの動きはmainでHogeクラスのインスタンスを二回作成することによって、initを二回呼んでいます。 疑問点は出力結果の挙動が予想外なことです。私としてはインスタンス作成時のiは初期化されていないため、 出力結果 null null になるのを期待しています。しかし二回目のinitでは前回に作成した123というデータが引き継がれています。この挙動はiはインスタンス変数ではなく、クラス変数のようにみえます。 しかしObjective-Cではクラス変数は存在しないとどっかのサイトに書いていました。 以上が質問です。なにかお気づきになった点があればごかいとういただけると幸いです。

専門家に質問してみよう