2011-02-08 5 views
2

テーブルビューで開始するNavコントローラがあります。各行は詳細UIViewにプッシュします。私は親UITableViewに戻ることなく、次と前のビューを表示する詳細UIViewの次と前のボタンを持っていたいと思います。すべての詳細は配列に保存されます。どのようにDetailViewController.m .Thanxでその配列とその現在のインデックスにアクセスすることができますか?次と前へ詳細を表示親に戻ることなくUIViewを表示UITableView

+0

似たような質問 [こちら] [1] [1]:http://stackoverflow.com/questions/6244776/iphone-navigate-to-previous-next-viewcontroller/11617283#11617283 –

答えて

2

クリーンな方法はDetailViewControllerのカスタム初期化子を作成することです:

@interface DetailViewController : UIViewController 
{ 
    NSArray* allObjects; 
    NSUInteger displayedObjectIndex; 
} 

- (id) initWithObjectAtIndex: (NSUInteger) index inArray: (NSArray *) objects; 

@end 


@implementation DetailViewController 

- (id) initWithObjectAtIndex: (NSUInteger) index inArray: (NSArray *) objects 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     allObjects = [objects copy]; 
     displayedObjectIndex = index; 
    } 
    return self; 
} 

@end 

こうすることで、DetailViewControllerは常にあれば、それは、の詳細を表示すると、次/前のオブジェクトされているものオブジェクトの両方を知っています。

+0

ありがとうCostique。それは本当にうまくいった。 Thanx man – Piscean

+0

次のページを表示するためにのみ機能します。次のボタンをもう一度クリックすると、空白のページが表示されます。私はdisplayedObjectIndex値にログオンしました。それは、次のボタンをクリックする前に、それと同じ値をdisplayObjectIndexが再び持っているようです。 – Piscean

+0

次の関数のコードは次のようになります。 - (IBAction)nextPage:(id)送信者 { \t displayedObjectIndex ++; \t DetailViewController * nextController = [[DetailViewController alloc] init]; \t NSString * storyyTitle = [[allObjects objectAtIndex:displayedObjectIndex] objectForKey:@ "title"]; \t nextController。title = @ "FindersFee"; \t nextController.sTitle = storyyTitle; \t [self.navigationController pushViewController:nextController animated:YES]; \t [nextController release]; } – Piscean

3

また、テーブルビューのデータソース(通常はテーブルを含むUIViewController)とディテールビューの間に何らかの接続を構築することもできます。これは典型的なDelegateパターンを使用して行うことができますCocoaフレームワーク。あなたは2つのだけの方法とDetailViewDataDelegateプロトコルを定義することができ、このような場合に :referenceObjectは、呼び出し対象となる

 
-(id)nextTableObjectFrom:(id)referenceObject; 
-(id)prevTableObject;(id)referenceObject; 

、それはDetailViewに詳述の目的です。 のでDetailViewはこのように定義されます。


@interface DetailViewController:UIViewController { 
} 
@property (nonatomic,assign) id currentDetailedObject; 
@property (nonatomic,assign) id dataDelegate; 

そしてもちろん、あなたがのtableViewからの典型的なコントローラを呼び出すとき:didSelectElementWithIndexPath:アニメーション:


DetailViewController *dv = [[[DetailViewController alloc] initWithNibName:nil bundle:nil] autorelease]; 
dv.dataDelegate=self; 
dv.currentDetailedObject=[mySourceArray objectAtIndexPath:indexPath.row]; 
[self.navigationController pushViewController:dv animated:YES]; 
:方法、あなたはこのような何かをします

最後に、DetailViewControllerのテーブルから次の(または前の)要素が必要になったときには、単に

 
-(IBAction)nextButtonPressed { 
    self.currentDetailedObject = [self.dataDelegate nextTableObjectFrom:self.currentDetailedObject]; 
} 

を呼び出すだけです。特にテーブルのUIViewControllerに実装されるデリゲートメソッドは、データ構造に依存します。 このアプローチの利点は、一見複雑なことですが、非常にエレガントで、コントローラーに沿ってオブジェクトを渡すことを避けます。これはしばしばメモリーの問題の原因です。デリゲートのアプローチに加えて、任意の複雑な機能を実装することができます(例:DetailViewControllerからテーブルビューオブジェクトを直接操作することもできます)。

+1

申し訳ありませんviggio24です。私はコード全体を理解できませんでした。私はObjective-CとiPhone開発の新機能です。私はどんなファイルDetailViewDataDelegateも持っていません。その代表者ファイルを説明できますか? Thanx – Piscean

+0

もちろん、委任プロトコルを定義する必要があります。したがって、DetailViewDataDelegateをプロトコルとして記述する必要があります。 @protocol DetailViewDataDelegate 2つのデリゲート関数を定義します。このコードは、DetailViewDataDelegateプロトコル実装者として宣言するコントローラに書き込まれます。このコードを書くのに十分なスペースがありませんが、この件に関する偉大なAppleのドキュメントを慎重に読んでください(AppleのObjective-Cプログラミングガイドでは非常に良い説明があります)。デリゲートパターンはココアの基本であるため、この読書をお勧めします。 – viggio24

+0

thanx私はそれを読むつもりです。ウルの助けをもう一度やってみろ。 – Piscean

関連する問題