編集2:次のコードを使用してViewControllerをポイントしようとしました。
UIStoryboard * iPadStoryboard = [UIStoryboard storyboardWithName:@ "iPadStoryboard"バンドル:nil]; GTGiftsIPadViewController * giftsIVC =(GTGiftsIPadViewController *)[iPadStoryboard instanceiateViewControllerWithIdentifier:@ "giftsTableViewControllerId"]; [giftsIVC setGiftsDelegate:self]; NSLog(@ "%@"、giftsIVC); NSLog(@ "%@"、[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]);
ただし、これは次のように出力します。
2012-06-02 14:28:47.148 Gift Manager[3958:707] <GTGiftsIPadViewController: 0xc6b9980>
2012-06-02 14:28:47.152 Gift Manager[3958:707] <GTGiftsIPadViewController: 0xc6a16d0>
giftsIVCが適切なViewControllerを指していないことを意味します。[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]で指定されたビューコントローラーを指す必要があります。ただし、このコードはポートレートビューとランドスケープビューの両方で機能しないため、使用できません。これは非常に簡単なことのように思えますが、私はこれを理解しようとして髪を引っ張っています!それは私を夢中にさせています!
編集:私は問題を理解しました、そしてそれは私がデリゲートをどのように設定しているかと関係があります。これは、デリゲートを設定する私の(貧弱な)方法です:
[[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0] setGiftsDelegate:self];
基本的に、[[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]は、テーブルビューコントローラーを参照しているだけです。[[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]の部分を除外するために、このコードを書く別の方法はありますか?
私は、主にデリゲートのアイデアにまだあまり慣れていないため、独自のデリゲートプロトコルを作成しないように努めてきました。とにかく、私は本当にそれを必要としていたので、私は先に進んで昨日それを作成しました、そしてそれには非常にうまくいきました!iPadが横向きモードのときに2つのコントローラーを表示する分割ビューコントローラーがあります(1つのテーブルビューとテーブルビュー内のオブジェクトの詳細ビュー)。デリゲートプロトコルの目的は、テーブルビュー内のオブジェクトが選択されたときに、テーブルビューが詳細ビューを更新できるようにすることです。これはランドスケープモードで機能します。ただし、ポートレートモードでは、ビューコントローラが1つと、テーブルビューを表示するポップオーバーを表示するためのボタンしかありません(これはiPadのメモアプリとほぼ同じです)。
私の問題は、ポートレートモードで、ポップオーバービューテーブルのオブジェクトが選択されている場合、didSelectGiftメソッドが呼び出されないことです。ただし、ランドスケープモードではそうです。以下の大文字のコメントを参照してください。
これは、デリゲートプロトコルの私のコードです。
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "GTAddIPadViewController.h"
@class GTGift, GTGiftCell;
@protocol GTGiftsIPadViewControllerDelegate;
@interface GTGiftsIPadViewController : UITableViewController
@property (nonatomic, assign) id <GTGiftsIPadViewControllerDelegate>giftsDelegate;
@property (nonatomic, strong) IBOutlet UITableView *giftsTable;
@end
@protocol GTGiftsIPadViewControllerDelegate <NSObject>
- (void)didSelectGift:(GTGift *)selectedGift;
@end
didSelectGiftはGTGiftsIPadViewControllerで呼び出されます
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
GTGift *gift = [[[GTGiftStore sharedStore] allGifts] objectAtIndex:[indexPath row]];
[giftsDelegate didSelectGift:gift]; //THIS FUNCTION IS NOT CALLED (TESTED BY PUTTING AN NSLOG INSIDE IT)
NSLog(@"%@", [gift name]); //THIS OUTPUTS PROPERLY THEREFORE TABLEVIEW:DIDSELECTROWATINDEXPATH: IS CALLED
}
デリゲートは、GTDetailIPadViewControllerと呼ばれるビューコントローラーでviewDidLoadメソッドを設定します
didSelectGiftメソッドはGTDetailIPadViewControllerに実装されています。
- (void)didSelectGift:(GTGift *)selectedGift
{
[self setDetailGift:selectedGift];
[self populateTable];
}
(populateTableは、detailGiftのインスタンス変数を使用し、詳細ビューにこれらの値を入力するメソッドです)
テーブルが分割ビューで表示されたときに完全に機能するのに、ポップオーバービューで表示されたときに機能しない理由を本当に理解できません。どんな助けでも本当にありがたいです、そして私は私の問題を明らかにしたことを望みます!ありがとうございました!