2016-07-01 11 views
0

rufen SearchWebView.hIch versuche Text in uiwebview zu suchen. Ich bin nicht in der Lage Funktion von View-Controller

#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 

Der Javascript enthält den folgenden 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); 
} 

Ich versuche, von meinem Viewcontroller wie folgt anzurufen:

-(IBAction)searchButtonPressed:(id)sender{ 

[_webview highlightAllOccurencesOfString:@"Bistritz"]; 

} 

Aber es zeigt Ausnahme `

UIWebView highlightAllOccurencesOfString:]: Unbekannter Selektor zum Beispiel gesendet.

Antwort

1

Dies ist passiert, seit Sie die SearchWebView Steckdose an eine UIWebView angeschlossen haben.

Wahrscheinlich ist die SearchWebView eine Unterklasse UIWebView, in der highlightAllOccurencesOfString: Methode deklariert und definiert ist. Diese Methode ist im Standard UIWebView nicht vorhanden, deshalb gibt es einen Fehler wie: unerkannter Selektor an Instanz gesendet.

Sie müssen die Klasse von UIWebView zu SearchWebView in Interface Builder ändern.

  1. zu Ihrer Identität Inspektor gehen
  2. SearchWebView
auf Ihre WebView
  • ändern die Klasse von UIWebView auswählen

    Class change in identity inspector