我正在尝试在uiwebview中搜索文本。我无法从视图控制器调用函数

时间:2016-07-01 05:18:31

标签: javascript ios objective-c uiwebview full-text-search

SearchWebView.h

#import <Foundation/Foundation.h>

@interface SearchWebView : UIWebView

- (NSInteger)highlightAllOccurencesOfString:(NSString*)str;
- (void)removeAllHighlights;
@end

SearchWebView.m

#import "SearchWebView.h"

@implementation SearchWebView

- (NSInteger)highlightAllOccurencesOfString:(NSString*)str
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js"];
    NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

    [self stringByEvaluatingJavaScriptFromString:jsCode];

    NSString *startSearch = [NSString stringWithFormat:@"window.onload = function (){uiWebview_HighlightAllOccurencesOfString('%@')}",str];
    [self stringByEvaluatingJavaScriptFromString:startSearch];

    NSString *result = [self stringByEvaluatingJavaScriptFromString:@"uiWebview_SearchResultCount"];
    return [result integerValue];
}

- (void)removeAllHighlights
{
    [self stringByEvaluatingJavaScriptFromString:@"uiWebview_RemoveAllHighlights()"];
}

@end

javascript包含以下代码:

var uiWebview_SearchResultCount = 0;

function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword)        
{

if (element) {
    if (element.nodeType == 3) {        // Text node
        while (true) {
        //if (counter < 1) {
        var value = element.nodeValue;  // Search for keyword in text node
        var idx = value.toLowerCase().indexOf(keyword);

        if (idx < 0) break;             // not found, abort

        //(value.split);

        //we create a SPAN element for every parts of matched keywords
        var span = document.createElement("span");
        var text = document.createTextNode(value.substr(idx,keyword.length));
        span.appendChild(text);

        span.setAttribute("class","uiWebviewHighlight");
        span.style.backgroundColor="yellow";
        span.style.color="black";

        uiWebview_SearchResultCount++;    // update the counter

        text = document.createTextNode(value.substr(idx+keyword.length));
        element.deleteData(idx, value.length - idx);
        var next = element.nextSibling;
        element.parentNode.insertBefore(span, next);
        element.parentNode.insertBefore(text, next);
        element = text;
        window.scrollTo(0,span.offsetTop);

    }
} else if (element.nodeType == 1) { // Element node
    if (element.style.display != "none" && element.nodeName.toLowerCase() != 'select') {
            for (var i=element.childNodes.length-1; i>=0; i--) {
                uiWebview_HighlightAllOccurencesOfStringForElement(element.childNodes[i],keyword);
            }
        }
    }
}
}

// the main entry point to start the search
function uiWebview_HighlightAllOccurencesOfString(keyword) {

    uiWebview_RemoveAllHighlights();
    uiWebview_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase());
}
// helper function, recursively removes the highlights in elements and their childs
function uiWebview_RemoveAllHighlightsForElement(element) {
if (element) {
    if (element.nodeType == 1) {
        if (element.getAttribute("class") == "uiWebviewHighlight") {
            var text = element.removeChild(element.firstChild);
            element.parentNode.insertBefore(text,element);
            element.parentNode.removeChild(element);
            return true;
        } else {
            var normalize = false;
            for (var i=element.childNodes.length-1; i>=0; i--) {
                if (uiWebview_RemoveAllHighlightsForElement(element.childNodes[i])) {
                    normalize = true;
                }
            }
            if (normalize) {
                element.normalize();
            }
        }
    }
}
return false;
}
// the main entry point to remove the highlights
function uiWebview_RemoveAllHighlights() {
    uiWebview_SearchResultCount = 0;
    uiWebview_RemoveAllHighlightsForElement(document.body);
}

我正试图从我的viewcontroller这样调用:

-(IBAction)searchButtonPressed:(id)sender{

[_webview highlightAllOccurencesOfString:@"Bistritz"];

}

但它显示异常`

  

UIWebView highlightAllOccurencesOfString:]:发送无法识别的选择器   例如。

1 个答案:

答案 0 :(得分:1)

这是因为您将SearchWebView电话号码连接到UIWebView

SearchWebView可能是一个子类UIWebView,其中声明并定义了highlightAllOccurencesOfString:方法。此方法在标准UIWebView中不存在,这就是为什么它会抛出如下错误:无法识别的选择器发送到实例

您需要在界面构建器中将UIWebView的类更改为SearchWebView

  1. 转到身份检查员
  2. 选择您的WebView
  3. 将UIWebView的类更改为SearchWebView
  4. Class change in identity inspector