2014-01-27 321 views
9

嗨我要給你鏈接一個視頻展示我的問題,因爲它有點難以用文字表達。 UITableView not scrolling to bottom 在視頻中,我點擊一個按鈕,將項目添加到列表中。請注意,我並未停留在第16項,並且我仍然向清單中添加了更多未顯示的項目。最後,在增加了新的項目,該列表會自動通過UITableView不滾動到底部

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]]; 

[self.tbl reloadData]; 

[self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

的主要問題是對視頻,在這裏我對最後的幾個項目滾動結束滾動,但我不能選擇它們。顯然這個問題必須處理UITableView的高度。我試圖在故事板編輯器中改變它,但它沒有做任何事情。有任何想法嗎?提前致謝!

+0

我有一個IBAction的「添加」按鈕。這是我在視頻中向項目表中添加項目的人。 – user2402616

+1

這可能是UITableView的contentSize屬性不正確的問題。我認爲最近我遇到了同樣的問題,在添加新單元格時,將一些調試代碼放入以查看您的內容大小是否正在更新 –

+0

內容大小的高度每次都會更新44(默認行高)。顯然寬度保持不變。高度從109開始,這是桌子開始的地方。現在只有當高度超過1024(iPad mini的高度)時纔會自動向下滾動。然而,從身高813-1033沒有新的項目出現。任何想法? – user2402616

回答

20

從我所看到和評論,我認爲這可能是您UITableView的高度比設備的屏幕尺寸更大,這意味着它不會好向下滾動,因爲這些項目尚未達到UITableViewUIScrollView的底部。

轉到IB並設置約束,以便UITableView等於視圖控制器的寬度和高度。

+0

我做到了,但是它重疊了頂部的所有元素。 IE瀏覽器。視頻中的按鈕。此外,「查看」模式是在「規模填補」屬性下 – user2402616

+1

哦對不起忘了按鈕。刪除約束並設置新的頂部和底部空間到容器和寬度(或開頭和尾部空間) –

+0

確定它現在有效,但有一個大錯誤。我不確定我做了什麼,但我無法撤銷在大聲笑前的情況。第一個視頻將向您展示如何將UITableView的約束與視圖控制器相關聯。第二部影片會告訴你發生了什麼事。 (http://www.youtube.com/watch?v=nt-h88hBdT8&feature=youtu.be)http://www.youtube.com/watch?v=r1zSNud1Xcs&feature=youtu.be – user2402616

6

最有可能的reloadData被調用時沒有完全執行,因爲它假定您可能會做出更多更改並告訴它重新加載。

嘗試引入零秒的延遲,給它一個機會運行:

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]]; 

[self.tbl reloadData]; 

double delayInSeconds = 0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
}); 

而且,你不應該在這種情況下使用reloadData。這是行應該如何補充說:

[_items addObject:[NSString stringWithFormat:@"Trawl %d", count]]; 

[self.postsTableView beginUpdates]; 
[self.postsTableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:_items.count - 1] withAnimation:NSTableViewAnimationEffectNone]; // maybe you want some other animation here 
[self.postsTableView endUpdates]; 

double delayInSeconds = 0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
}); 
+0

我使用「NSTableViewAnimationEffectNone」的未聲明標識符。而且,引入的延遲沒有效果。 – user2402616

+1

對不起,對於動畫,可能是'UI'而不是'NS',請檢查表格視圖文檔。你應該使用它來代替reloadData。 –

+1

不確定你的問題是如果引入延遲沒有解決它,也許@Nic Robertson是正確的,在這種情況下,它聽起來像蘋果需要解決的錯誤...並且你需要找到一種解決方法,直到那時。 –

0

似乎你們大多數人都是錯的。

它應該是這樣的:

[self.tbl scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:self.items.count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

也就是說,應該是UITableViewScrollPositionTop,不UITableViewScrollPositionBottom。 atScrollPosition:UITableViewScrollPositionTop是更改的起源,而不是目的地。