2016-07-26 9 views
0

Ich habe UIWebView in den meisten der Zelle UITableView, die zum Anzeigen von Video verwenden.
In den meisten Fällen wird die Anzahl der Zellen geringer sein, aber diese könnten endlos sein. Beim Scrollen UITableView; webView lädt seine Daten jedes Mal neu.Hinzufügen neuer (nicht wiederverwendbare) Zellen für jede Zeile in UItableview swift

Kann jemand eine Lösung haben, wie man für jede Zeile eine neue Zelle erstellt, anstatt dequeueReusableCellWithIdentifier zu verwenden, um das erneute Laden in UIWebView zu verhindern.


Ich möchte immer noch nicht jedes Mal neue Zelle erstellen.
Aber dann Wie verhindert man WebView jedes Mal neu zu laden?

+0

Können Sie zeigen Ihre cellForRowAtIndexPath so dass ich leicht zeigen können, wie Sie Ihr Problem zu beheben. – pnizzle

Antwort

0

Sie können

// MARK: - Properties 

private var cells: [NSIndexPath: VideoCell] = [:] 
private var videos: [Video] = [] 

// MARK: - UITableViewDataSource 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cachedCell = self.cells[indexPath] { 
     return cachedCell 
    } 
    else { 
      let videoCell = tableView.dequeueReusableCellWithIdentifier(VideoCell.ReuseIdentifier, forIndexPath: indexPath) as! VideoCell 
      videoCell.bindWith(self.videos[indexPath]) 
      self.cells[indexPath] = videoCell 
      return videoCell 
     } 
    } 

// MARK: - UITableViewDelegate 

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    guard let videoCell = cell as? VideoCell else { 
     return 
    } 
    videoCell.refresh() 
} 

Wörterbuch mit NSIndexPath als Schlüssel und UITableViewCell als Wert erstellen Wenn Sie eine Menge von Zelle haben, werden Sie mit Speicherprobleme stellen kann.

0

Sie müssen die Zelle wiederverwenden und das Webview in der Zelle neu laden, wenn Sie die Effizienz und Leistung berücksichtigen, laden Sie einfach die noch nie gespielte, und gleichzeitig die Videodaten oder die HTML-Daten zu lokalen Cache . Auf der anderen Seite können Sie zum Abspielen einer Zelle das Objekt von webview aufzeichnen, diese Webviews direkt in der wiederverwendeten Zelle einrichten.

Pseudo-Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    YourCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier" forIndexPath:indexPath]; 
    // If the video at this row is playing, just setup webview 
    UIWebView *webView = [self webviewOfPalyingForIndexPath: indexPath]; 
    if (webView) { 
     [cell setupWithWebview: webView]; 
    } else { 
     // Configure cell with reused webview 
     static UIWebView *publicWebview = [UIWebView new]; 
     [cell setupWithWebview: publicWebview]; 

     // Check if the data of webview is cached 
     NSData *cachedData = [self readCachedDataForIndexPath: indexPath]; 
     if (cachedData) { 
      [cell setupWithCachedData:cachedData]; 
     } else { // If not cached, load url and cach the data 
      [cell setupWithUrl: your_url]; 
      [self cacheDataForUrl: your_url]; 
     } 
    } 
    return cell; 
} 

// Record webview of playing at indexPath 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    YourCell *cell = (YourCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self recordPlayingWebView: cell.webview atIndexPath: indexPath]; 
} 

Hoffnung meine Antwort sehr nützlich für Sie ist.

UPDATE:

Pseudo-Code mit Swift:

let reusedWebview = UIWebView() 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) 
    // If the video at this row is playing, just setup webview 
    let webView = self.webviewOfPalyingForIndexPath(indexPath) 
    if (webView != nil) { 
     cell.setupWithWebview(webView) 
    } else { 
     // Configure cell with reused webview 
     cell.setupWithWebview(resuedWebview) 

     // Check if the data of webview is cached 
     let cachedData = self.readCachedDataForIndexPath(indexPath) 
     if (cachedData != nil) { 
      cell.setupWithCachedData(cachedData) 
     } else { // If not cached, load url and cach the data 
      cell.setupWithUrl(your_url) 
      self.cacheDataForUrl(your_url) 
     } 
    } 
    return cell; 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    self.recordPlayingWebView(cell.webview, forIndexPath: indexpath) 
} 
+1

@EricD Danke, aktualisiert die Antwort. – Yahoho