1

編集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のインスタンス変数を使用し、詳細ビューにこれらの値を入力するメソッドです)

テーブルが分割ビューで表示されたときに完全に機能するのに、ポップオーバービューで表示されたときに機能しない理由を本当に理解できません。どんな助けでも本当にありがたいです、そして私は私の問題を明らかにしたことを望みます!ありがとうございました!

4

1 に答える 1

1

したがって、このコード:

[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]

テーブルビューコントローラを参照するには...それは少しクレイジーです:-)

また、デリゲートがここに行く方法ではないと思います。

XCodeで標準のマスター/詳細分割ビュープロジェクトを作成した場合、マスターコントローラー(テーブルビューコントローラー)には、DetailViewControllerへのポインターが必要です(私が正しく理解していれば、それはコードでデリゲートと呼ばれる部分です) 。

したがって、デリゲートを宣言する代わりに、そのdetailViewControllerを直接ポイントするだけです。

何らかの理由でそのポインターが存在しない場合は、ポインターを作成する必要があります。マスターと詳細が初期化されるたびに、次のようになります。

MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
masterViewController.detailViewController = detailViewController;

(マスターと詳細がここのようなコードで割り当てられていない場合でも、両方とも共通の場所からアクセスできる必要があります。たとえば、アプリデリゲートは、IBOUtletとして、コードの3行目を使用します。マスターのヘッダーにあるプロパティ'detailViewController')

そうすれば、常にマスタービューコントローラーからdetailViewControllerを参照する必要があるため、テーブルビューコントローラー(マスター)から任意のメソッドを呼び出すことができます。

[detailViewController didSelectGift:selectedGift];
于 2012-06-03T07:37:12.730 に答える