4

以下に示す Customer.h ファイルでプロトコルを定義しました。

@class Customer; 
@protocol CustomerDelegate <NSObject>

-(void) didSelectCustomer:(Customer *) customer; 

@end

@interface Customer : NSObject
{

}

@property (nonatomic,copy) NSString *name; 
@property (nonatomic,copy) NSString *occupation; 

@end

MasterViewController (左側) は、次のように didSelectCustomer メソッドを呼び出します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Customer *selectedCustomer = [customers objectAtIndex:[indexPath row]];
    [self.delegate didSelectCustomer:selectedCustomer]; 
}

ここで、DetailViewController (右側) に何かをするように指示する必要があります。DetailViewController は CustomerDelegate プロトコルに準拠しています。

@interface DetailViewController : UIViewController<UISplitViewControllerDelegate,CustomerDelegate>
{

}

-(void) didSelectCustomer:(Customer *)customer
{
    NSLog(@"sssdasdasdasd");
}

didSelectCustomer メソッドが呼び出されることはありません。masterViewController.delegate = self を設定する必要があると思いますが、どこに設定すればよいかわかりません。

更新 1:

DetailViewController 内に MasterViewController のインスタンスを追加しましたが、機能しませんでした。

- (void)viewDidLoad
{
    [super viewDidLoad];    

    MasterViewController *master = [[MasterViewController alloc] init];
    master.delegate = self; 
}

解決:

AppDelegate で:

  else 
    {
        UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController; 
        splitViewController.delegate = [splitViewController.viewControllers lastObject];



        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
       // splitViewController.delegate = (id)navigationController.topViewController;




        DetailViewController *detail =(DetailViewController *) [splitViewController.viewControllers lastObject];

        UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0];

        MasterViewController *master = (MasterViewController *)masterNavigationController.topViewController;

        master.delegate = detail; 
    }
4

2 に答える 2

0

Consumer クラスへのデリゲートとして自分自身を明示的に宣言することはありません。それに合わせるだけではダメです。おそらく次のように、Consumer のインスタンスを作成して、-viewDidLoad で宣言します。

-(void)viewDidLoad {
    Consumer *consumer = [[Consumer alloc]init];
    [consumer setDelegate:self];
}

また、Consumer でデリゲート オブジェクトのプロパティを宣言しないため、実際にアクセスすることはできません。最初にこれを行います:

@class Customer; 
@protocol CustomerDelegate <NSObject>

-(void) didSelectCustomer:(Customer *) customer; 

@end

@interface Customer : NSObject
{

}

@property (nonatomic,copy) NSString *name; 
@property (nonatomic,copy) NSString *occupation; 
@property (weak) id <CustomerDelegate> delegate; //use assign or __unsafe_unretained if targeting <5.0.

@end

次のように、クラスがプロトコルに準拠しているかどうかを確認できます。

if (![delegate conformsToProtocol:@protocol(CustomerDelegate)]) {
    [NSException raise:@"Delegate Exception"
                format:@"Parameter does not conform to CustomerDelegate protocol at line %d", (int)__LINE__];
}
于 2012-04-04T21:32:26.133 に答える