トップ «前の日記(2012-01-19) 最新 次の日記(2012-01-21)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|

2012-01-20 [iOS]モーダルViewController(その2)

昨日、説明したモーダル・ビュー。iOS4から利用できる様になったBlocksを使えば、もっと、簡単に記述できる、はず。多分。

モーダル・ビューで、Blocksと扱うイベントを定義する。

typedef enum ModalPaneViewControllerResult {
    ModalPaneViewControllerResultCancelled,
    ModalPaneViewControllerResultDone
} ModalPaneViewControllerResult;
 
typedef void (^ModalPaneViewControllerCompletionHandler)(ModalPaneViewControllerResult result);

モーダル・ビューで、delegateプロパティの代わって、Blocksをプロパティとして追加する。

@interface ModalPaneViewController : UIViewController
 
@property (nonatomic, copy) ModalPaneViewControllerCompletionHandler    completionHandler;
 
- (IBAction)done:(id)sender;
- (IBAction)cancel:(id)sender;
@end

モーダル・ビューで、デリゲートのメソッドを呼んであげる代わりに、Blocksを呼ぶ。

@implementation ModalPaneViewController
 
@synthesize completionHandler = _completionHandler;
 
- (IBAction)done:(id)sender
{
    if (self.completionHandler) {
        self.completionHandler(ModalPaneViewControllerResultDone);
    }
}
 
- (IBAction)cancel:(id)sender
{
    if (self.completionHandler) {
        self.completionHandler(ModalPaneViewControllerResultCancelled);
    }
}
 
@end

呼び出し元のモーダル・ビューを開くコードは以下のとなる。

- (IBAction)modalPane:(id)sender
{
    ModalPaneViewController *viewController = [[ModalPaneViewController alloc] 
                                               initWithNibName:@"ModalPaneViewController"
                                               bundle:nil];
    [viewController setCompletionHandler:^(ModalPaneViewControllerResult result) {
        switch (result) {
            case ModalPaneViewControllerResultCancelled:
                [self performSelectorOnMainThread:@selector(didCencel:) withObject:nil waitUntilDone:NO];
                break;
            case ModalPaneViewControllerResultDone:
                [self performSelectorOnMainThread:@selector(didDone:) withObject:nil waitUntilDone:NO];
                break;
            default:
                break;
        }
        
        [self dismissModalViewControllerAnimated:YES];
    }];
    [self presentModalViewController:viewController animated:YES];
}
 
- (void)didDone:(id)arg { }
 
- (void)didCencel:(id)arg { }

確かにスッキリした気がするが、楽になったかどうかは。。。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/ModalPane - GitHub

トップ «前の日記(2012-01-19) 最新 次の日記(2012-01-21)» 編集