iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
昨日、説明したモーダル・ビュー。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 { }
確かにスッキリした気がするが、楽になったかどうかは。。。