2012年4月22日日曜日

objective-cのdelegateを実装する

objective-cでのdelegateとは参照先のオブジェクトから参照元のオブジェクとに対して通知したりメッセージ送信などそれぞれの処理を参照元に委ねるものです。

よく使う機能としてはカメラの撮影やテキストフィールドの入力後処理などがあります。
自分で実装する例は下のようなかんじです。
(PopoverControllerなどでTableViewControllerを開き、そこで選択した情報を参照元のViewに戻すというもの)

ViewController.h
@interface ViewController : UIViewController
<
    SubViewDelegate
>
{
    UIPopoverController *popoverController;
}

ViewController.m
- (void)doAction:(id)sender
{
    // 参照先のオブジェクト生成
    SubViewController *sv = [[SubViewController alloc] init];
    sv.contentSizeForViewPopover = sv.view.frame.size;
    sv.delegate = self;

    popoverController = [[UIPopoverController alloc] initWithContentViewController:sv];
    [sv release];

    [popoverController presentPopoverFromBarButtonItem:sender
                                    permittedArrowDirections:UIPopoverArrowDirectionAny
                                    animated:YES];
}

// 参照先のdelegate実装
- (void)subviewController:(SubViewController *)view didSelectedIndex:(NSInteger)index
{
    [popoverController dismissPopoverAnimated:YES];

    NSLog(@"selected %d", index);
}

SubViewController.h
@class SubViewController;
@protocol SubViewDelegate 

- (void)subviewController:(SubViewController *)view didSelectedIndex:(NSInteger)index;

@end

@interface SubViewController : UITableViewController

@property (assign) id delegate;

SubViewController.m
@implementation SubViewController
@synthesize delegate;

〜省略〜

- (void)tableView:(UITableView *)tableView didSelectedRowAtIndexPath:(NSIndexPath *)indexPath
{
    [delegate subviewController:self didSelectedIndex:[indexPath row]];
}

とまぁこんなかんじです。
実際に作ってみるとそう難しいものでもないので試してみてください。




0 件のコメント:

コメントを投稿