2012-01-28 10 views
0

DataViewControllerのRootViewControllerのインスタンスにアクセスできるように、クラス(DataViewController)のIBOutletを別のクラス(RootViewController)に接続しようとしています。Xcode 4.2.1、iOS 5.0およびストーリーボードを使用してIBOutletに接続できません

コンパイルに関する警告やエラーはありません。 IBシーンでDataViewControllerを選択すると、Connections Inspector-> Outletsで定義したコンセントが表示されます。しかし、コンセントからRootViewControllerへの接続をドラッグしようとすると、動作しません。エラーや何が間違っているかを示すことなくただ失敗します。

私は、RootViewControllerシーンにカスタムクラス "RootViewController"があることを確認しました。

は、ここに私のコードです:私は間違って

//RootViewController.h 
#import <UIKit/UIKit.h> 

@interface RootViewController : UIViewController <UIPageViewControllerDelegate> 
@property (strong, nonatomic) UIPageViewController *pageViewController; 
@end 


//DataViewController.h 
#import <UIKit/UIKit.h> 
@class RootViewController; 

@interface DataViewController : UIViewController <UIWebViewDelegate> { 
    IBOutlet UIWebView *webView; 
} 
@property (strong, nonatomic) IBOutlet RootViewController *rvc; //this one won't connect. Why? 
@property (strong, nonatomic) IBOutlet UILabel *dataLabel; 
@property (strong, nonatomic) id dataObject; 
@end 

//DataViewController.m 
#import "DataViewController.h" 
#import "RootViewController.h" 

@implementation DataViewController 

@synthesize rvc; 

//... 
@end 

何をしているのですか?

答えて

3

これはできません。デリゲートプロトコルをセットアップする必要があります。 This tutorial を参照して、「new delegate」という単語を検索し、それがどのように行われたかを説明します。それがあなたが使用する必要があるデザインパターンです。いくつかのステップがありますので、詳しくお読みください。それは学習価値があります。デリゲートプロトコルは、iPhoneアプリケーションでは一般的です。

現在のプロジェクトでは、2つのコントローラSelectNoteViewController(Select)とEditNoteViewController(Edit)の間で通信する代理プロトコルを作成しました。基本的な考え方は、選択がノートのリストから選択するために使用され、編集がそれらのノートを編集するために使用されることです。ここでは、Selectで管理されているリストから前または次のノートを呼び出すためにボタンを編集しているため、Selectで保持されているデータとメソッドにアクセスできるようにするにはEditが必要です。選択は編集の代理人です。これは、セレクトが編集のために行うことを意味します。ここに必須のコードがあります。

SelectNoteViewController.h:

// this next statement is need to inform Select of the protocols defined in Edit 
#import "EditNoteViewController.h" // STEP 1 


@interface SelectNoteViewController : UITableViewController <EditNoteViewControllerDelegate> { ... // STEP 2: this says Select implements the protocol I created 
... 
// STEP 3: EditNoteViewController Delegate Methods - these are the methods in the protocol 
- (Notes *)selectPreviousNote; 
- (Notes *)selectNextNote; 

SelectNoteViewController.m:

// STEP 4: the protocol methods are implemented 
- (Notes *)selectPreviousNote { 
    if (isPreviousToSelectedNote) { 
     NSIndexPath *indexPath, *previousIndexPath; 
     indexPath = [self.tableView indexPathForSelectedRow]; 
     previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:0]; 
     // update the selected row 
     self.selectedNote = [self.fetchedResultsController objectAtIndexPath:previousIndexPath]; 
     [self.tableView selectRowAtIndexPath:previousIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 
     [self setPreviousNote]; 
     [self setNextNote]; 
    } 
return selectedNote; 
} 

- (Notes *)selectNextNote { 
    if (isNextToSelectedNote) { 
     NSIndexPath *indexPath, *nextIndexPath; 
     indexPath = [self.tableView indexPathForSelectedRow]; 
     nextIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:0]; 
     // update the selected row 
     self.selectedNote = [self.fetchedResultsController objectAtIndexPath:nextIndexPath]; 
     [self.tableView selectRowAtIndexPath:nextIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle]; 
     [self setPreviousNote]; 
     [self setNextNote]; 
    } 
return selectedNote; 
} 
... 
    ... 
if ([[segue identifier] isEqualToString:@"editNote"]) { 
    // STEP 5: this is where Edit is told that its delegate is Select 
    [[segue destinationViewController] setEditNoteViewControllerDelegate:self]; // STEP 5 

選択は現在、編集のためのデリゲートも行う構造となっています。これでEditは、Selectのメソッドに到達するために使用するプロトコルを最後に定義する必要があります。

EditNoteViewController.h

#import ... // put protocol after import statements 
// STEP 6 
@protocol EditNoteViewControllerDelegate <NSObject> 

- (Notes *)selectPreviousNote; 
- (Notes *)selectNextNote; 

@end 


@interface ... 
// STEP7: Edit needs a property to tell it who the delegate is - it was set back in Select.m 
@property (weak) id <EditNoteViewControllerDelegate> editNoteViewControllerDelegate; 

ことですEditNoteViewController.m

// STEP 8: the property is synthesized 
@synthesize editNoteViewControllerDelegate; 

... 

// STEP 9: now when any method needs to call selectPreviousNote or selectNext Note it does it like this: 
selectedNote = [self.editNoteViewControllerDelegate selectPreviousNote]; 
// or 
selectedNote = [self.editNoteViewControllerDelegate selectNextNote]; 

。もちろん、プロトコルのメソッドは、他のメソッドのようなもので、最初にあなたの質問だったデータを返すために必要なパラメータを渡すことができます。副次的なことは、Editでプロパティを作成し、SelectのPreportForSegueメソッドでこれらのプロパティを設定することで、プロトコルなしでSelect to Editからデータを渡すことができることを見てください。そうすることで、Editがインスタンス化されたときにいくつかのパラメータを設定することができます。デリゲートプロトコルの私の使用は、選択に戻り、別のノート(前または次)を編集に渡します。私はそれが助けて欲しいデリゲートプロトコルを作成するには、いくつかの手順があることがわかります。私はそれらに1-9の番号をつけた。データが元に戻っていない場合、私は通常、ステップの1つを忘れてしまった。

+0

応答のおかげで、私はチュートリアルを読んで、デリゲートプロトコルパターンについてもう少し読んだ。私は基本的にそれを得るが、あなたが気にしないなら、それを適用するヒントをもう少し必要とする。私はRootViewControllerをデリゲートプロトコルに準拠させたいと考えていますか?そして、私はRootViewController.hで代理プロパティを作成し、次にRootViewController.mで@synthesizingすることでそれを達成するでしょうか?または私は混乱していますか? –

+0

私は私の答えに追加するので、私はコードを含めることができます。 –

+0

私は正しい道を選んでくれてありがとう - 最終的に私がする必要があったのは元に戻って、根底にあるMVCパターンを正しく理解していることを確認することでした。私は優れたスタンフォード講義シリーズ(iTunes U経由で入手可能)を使用しましたが、何が起こっているのかをはっきりと理解しています。 –

関連する問題