Dheeraj Chahar
Dheeraj Chahar

Reputation: 116

I'm trying to search text in uiwebview. I'm unable to call function from view controller

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

The javascript contains the following code:

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);
}

I'm trying to call from my viewcontroller like this:

-(IBAction)searchButtonPressed:(id)sender{

[_webview highlightAllOccurencesOfString:@"Bistritz"];

}

But it is showing exception `

UIWebView highlightAllOccurencesOfString:]: unrecognized selector sent to instance.

Upvotes: 0

Views: 181

Answers (1)

user3182143
user3182143

Reputation: 9589

This happened since you connected the SearchWebView outlet to a UIWebView.

Probably the SearchWebView is a subclassed UIWebView in which highlightAllOccurencesOfString: method is declared and defined. This method is not present in standard UIWebView, that's why it is throwing an error like: unrecognized selector sent to instance.

You need to change the class of UIWebView to SearchWebView in interface builder.

  1. Go to your identity inspector
  2. Select your WebView
  3. Change the class of UIWebView to SearchWebView

Class change in identity inspector

Upvotes: 1

Related Questions