2011-03-06 82 views
5

我目前有一個桌面視圖,其中嵌入了自定義單元格內的YouTube視頻。UITableView iPhone應用內的YouTube視頻

我這樣做是因爲從我的研究中,它似乎是允許加載視頻而不離開我的應用程序的唯一方法。

問題是這樣的:

縮略圖需要一段時間來加載。

當我向下滾動視頻列表時,它不斷加載thunbnails。

如果我向後滾動......它會嘗試再次加載視頻縮略圖。

有沒有人有任何建議,要麼這樣做的更好的方法,或獲得表格單元格保持數據,而不是取代它的方式?

我的代碼如下所示:

CustomVideoCell *cell = (CustomVideoCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomVideoCell"]; 

if (cell == nil) { 

UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"CustomVideoCell" bundle:nil]; 

cell = (CustomVideoCell *)temporaryController.view; 

[temporaryController release]; 


GDataEntryBase *entry = [[self.feed entries] objectAtIndex:indexPath.row]; 
NSString *title = [[entry title] stringValue]; 
NSString *videoID = [[(GDataEntryYouTubeVideo *)entry mediaGroup] videoID]; 


NSString *htmlString = 
[ 
[NSString alloc] 
initWithFormat:@"<html><head><meta name = \"viewport\" content = \"initial-scale = 2.0, user-scalable = no, width = 110\"/></head><body style=\"background:#000;margin-top:0px;margin-left:0px\"><div><object width=\"110\" height=\"90\"><param name=\"movie\" value=\"http://www.youtube.com/v/%@&f=gdata_videos&c=ytapi-my-clientID&d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/%@&f=gdata_videos&c=ytapi-my-clientID&d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"110\" height=\"90\"></embed></object></div></body></html>", 
videoID, videoID 
]; 


[[[cell.web subviews] lastObject] setScrollEnabled:NO]; 
[cell.web loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"http://www.website.com"]]; 

cell.title.text = title; 

乾杯

+0

有誰知道有什麼好的線程和/或教程,因爲我想要做這樣的事情,但真的不知道從哪裏開始。對不起,我是一個新手。 – tallen11 2011-03-29 20:15:59

回答

3

我在這些情況下做的是創建一個函數,它填充我需要的表格單元格的可變數組。
然後在方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

我返回小區是基於該指數這樣的數組中:

return [cellArray objectAtIndex:indexPath.row]; 

我創建了非常大的可變陣列,這種方式並沒有任何記憶的問題,但我想這取決於你的應用中的其他東西。

+0

感謝隊友,這個方法效果很好,也停止了滾動的滯後! – mattmate 2011-03-07 22:05:11

+0

@Zigglzworth緩存單元需要一些時間。你在哪裏實施它? viewDidLoad中? – Katerina 2015-10-16 17:30:05

0

不要出隊並重復使用表格單元格。性能會受到影響,因爲您一直在分配新的單元,但它應該可以工作。當你得到一個記憶警告,然後開始釋放細胞。

+0

謝謝,我試過這個,但是因爲每個單元格都包含一個web視圖,當它們離開屏幕時,它們似乎卸載....然後當它們回到屏幕上時,它們再次加載......這進而強制它重新加載Youtube的縮略圖 – mattmate 2011-03-06 14:31:49

+0

你有沒有考慮過使用一個大的UIWebView來實現表格? – tomislav 2011-03-06 15:36:26

1

緩存僅僅是Web視圖,而不是整個表格單元格。這樣你仍然可以重用這些單元格。 我用YouTubeView從這裏 http://iosdevelopertips.com/video/display-youtube-videos-without-exiting-your-application.html

-(void) cacheYouTubeViews { 
NSArray * videos = [self.fetchedResultsController fetchedObjects]; 
self.myVideosCache = [[NSMutableArray alloc] initWithCapacity:[videos count]]; 

for (Video * video in videos) { 
    YouTubeView * youTubeView = [[YouTubeView alloc] 
           initWithStringAsURL: video.link 
           frame:CGRectMake(0, 0, 
                kVideoThumbnailSize, 
                kVideoThumbnailSize)]; 
    [self.myVideosCache addObject:youTubeView]; 


    } 


} 

然後在你的cellForRowAtIndexPath方法更換電池的YouTubeView:

YouTubeView * youTubeView = [self.myVideosCache objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:youTubeView]; 

務必從小區的子視圖層次結構中刪除舊的YouTubeView。
我發現表滾動時發生內存泄漏,可能是在UITableView中使用UIWebView的一個普遍問題。

相關問題