2

HTML文字列をロードするUIWebViewがあり、Javascriptを使用してコンテンツを追加できます。

Web ビューに何か (テキストまたは画像) が貼り付けられたことを知る方法はありますか。

NSString *path = [[NSBundle mainBundle] pathForResource:@"htmlString" ofType:@"txt"];
NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[self.ibWebView loadHTMLString:htmlString baseURL:nil];


- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *jsToEncloseInEditableContainer = [NSString stringWithFormat:@"function contentedited(e){window.location='mpscontentedited://' + e.keyCode;};(function() {var body = document.body;var contentContainer =  document.createElement('div');contentContainer.id = 'content';contentContainer.setAttribute('contenteditable','true');contentContainer.style.fontFamily=' Helvetica';contentContainer.style.marginTop=\"15px\";contentContainer.onkeydown = contentedited;contentContainer.onpaste=contentedited;var node;while(node=body.firstChild) {contentContainer.appendChild(node);}body.appendChild(contentContainer);%@body=undefined;delete body;contentContainer=undefined;delete contentContainer;node=undefined;delete node;})();", @"contentContainer.focus();"];
    [self.ibWebView stringByEvaluatingJavaScriptFromString:jsToEncloseInEditableContainer];
}

UIResponder の paste: メソッドをオーバーライドしようとしましたが、呼び出されません。

- (void)paste:(id)sender
{
    NSLog(@"paste not called");
}

カスタムメニューボタンも作成しようとしました

UIMenuController *menu = [UIMenuController sharedMenuController];
UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"Paste Custom" action:@selector(pasteCustom:)];
[menu setMenuItems:@[item]];
[menu setMenuVisible:YES];

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(pasteCustom:))
    {
        return YES;
    }
    return [super canPerformAction:action withSender:sender];
}

- (void)pasteCustom:(id)sender
{
    NSLog(@"paste custom");
    [super paste:sender]; // --> calling this causes a crash (unrecognized selector sent to instance)
}

私は何を間違っていますか?

何かがいつ貼り付けられたかを知りたいか、デフォルトの貼り付けボタンと同様に動作するカスタムメニューボタンが必要です。

前もって感謝します。

4

2 に答える 2

3

キャスティングは魔法ではありません。

繰り返しますが、キャスティングは魔法ではありません!

オブジェクトの実行時の型は変更されません。セレクターに として応答しなかった場合UIWebView、いずれかとして応答しませんUIMenuItem。JavaScript を使用してイベントを検出し、JavaScript 関数を Objective-C にブリッジする必要があります。JavaScript イベント ハンドラーを使用してonpaste、次に説明されているようなことを行います

<!-- snippet from your HTML string -->
<script type="text/javascript">

    function call_objc_paste(text)
    {
        window.location.href = "fakescheme://" + text;
    }

</script>

<input type="text" onpaste="call_objc_paste(this.value);" />

// Objective-C code:
webView.delegate = self;
[webView loadHTMLString:htmlStr baseURL:nil];

- (BOOL)           webView:(UIWebView *)wv
shouldStartLoadWithRequest:(NSURLRequest *)rq
            navigationType:(UIWebViewNavigationType)navT
{
    NSString *rqStr = rq.URL.absoluteString;
    NSString *scheme = @"fakescheme://";
    if ([rqStr hasPrefix:scheme]) {
        NSString *pastedText = [rqStr substringFromIndex:scheme.length];
        // potentially do somethin with pastedText, then

        return NO;
    }

    // it's not our fake URL scheme, just normal navigation
    return YES;
}
于 2013-08-19T15:21:41.607 に答える