Menu とペーストボードの活用
状況に応じたメニュー(いわゆるコンテクストメニュー)や自分のアプリ内でも Web でも文字列を任意に送れる Paste 機能はとても便利。つまり、状況に応じて任意のメニューで特定の文字列のペーストが行えるようになるとアプリの幅が拡がる。少し調べた所、決定版になるページがなかったのでここではそんな Tips を紹介する
- メニューの出現方法
- イベント拾う
メニューを展開するにあたり重要になってくるのが、イベントを拾うことだ。touchs began で検索すればいくつかのページが出てくる。今回はちょっと変則的にキーボードの出現タイミングを利用することにした。123456789101112131415161718192021222324252627- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];self.navigationItem.title = _detailItem.name;// NSURL *url = [NSURL URLWithString:@"http://www.yahoo.co.jp"];NSURL *url = [NSURL URLWithString:_detailItem.address.loginURL];NSURLRequest *req = [NSURLRequest requestWithURL:url];[myWebView loadRequest:req];[self copyToID];// Start observingif (!_observing) {NSNotificationCenter *center;center = [NSNotificationCenter defaultCenter];[center addObserver:selfselector:@selector(keyboardWillShow:)name:UIKeyboardWillShowNotificationobject:nil];[center addObserver:selfselector:@selector(keybaordWillHide:)name:UIKeyboardWillHideNotificationobject:nil];_observing = YES;}}12345678910111213141516- (void)keyboardWillShow:(NSNotification *)notificatioin{NSMutableArray* menuItems = [NSMutableArray array];UIMenuController* menuController = [UIMenuController sharedMenuController];[menuController setTargetRect:CGRectZero inView:self.view];menuController.arrowDirection = UIMenuControllerArrowDown;[menuItems addObject:[[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"login-ID", @"") action:@selector(menu1:)]];[menuItems addObject:[[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"login-PWD", @"") action:@selector(menu2:)]];menuController.menuItems = menuItems;[menuController setMenuVisible:YES animated:YES];return;} - menu のセット
メニューの作成のコードを記述する。この部分の分岐でコンテクストに対応したメニューとなる
123456789- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {if (action == @selector(menu1:) ||action == @selector(menu2:) ||action == @selector(paste:)){return YES;}return [super canPerformAction:action withSender:sender];}
- イベント拾う
- ペーストボードのハンドリング
- findFirstResponder の活用
今回のソフトでは findFirstResponderを活用します。
1234567891011121314151617181920@implementation UIView (FindFirstResponder)- (UIView *)findFirstResponder{if (self.isFirstResponder) {return self;}for (UIView *subView in self.subviews) {UIView *firstResponder = [subView findFirstResponder];if (firstResponder != nil) {return firstResponder;}}return nil;}@end - menu の設定
先ほど設定したメニューの具体的な処理を記述します。動作させたい内容を実装します。今回の場合はテキストボックス(アプリ、Web内問わず)に文字列を送ります。
12345678910111213141516171819- (void)menu1:(id)sender{[self copyToID];UIView* firstView = [myWebView findFirstResponder];if ([firstView respondsToSelector:@selector(paste:)]) {[firstView paste:sender];}}- (void)menu2:(id)sender{[self copyToPassword];UIView* firstView = [myWebView findFirstResponder];if ([firstView respondsToSelector:@selector(paste:)]) {[firstView paste:sender];}}
- findFirstResponder の活用
- ダウンロード
今回のソフトは下記からダウンロードできます。
pwdSupporter