簡體   English   中英

彈出視圖控制器后UITableViewController奇怪的行為

[英]UITableViewController weird behavior after popping a view controller

我的UITableView有一堆可重復使用的單元格,當我點擊其中一個時,它會帶我到另一個視圖控制器(通過push segue)顯示該單元格的細節(讓我們說它是一個項目,所以它會顯示有關的細節)項目 - 名稱,價格,圖像等...)。 當我彈出該視圖控制器時(通過點擊后退按鈕), UITableView有一個奇怪的行為:

a)如果它一直滾動到底部,它將自動滾動(大約50點),使最后一個單元格幾乎不可見,所以我必須再次向下滾動。 我的牢房全高60分。

b)滾動條總是顯示然后消失,表明某些東西正在移動UITableView (雖然如果沒有滾動到底部,內容將不會自動移動)。

這發生在我的應用程序中的多個UITableView中。 我沒有強制在viewWillAppear中重新加載表視圖,所以我不明白發生了什么。 從服務器加載后,我的內容是靜態的(除非用戶更改它,然后執行重新加載)。 但只是顯示項目的詳細信息並彈出該VC不會改變表格視圖中的任何內容。

編輯:好的,我已經弄清楚問題是什么:我在推送那個segue時隱藏了一個UIToolbar 如果我保持它始終可見(我不想要),它仍會在我的表視圖中彈出時顯示動畫滾動條,但如果在最后幾行中不滾動表視圖。

將以下內容添加到viewDidLoad。

self.automaticallyAdjustsScrollViewInsets = NO;

這解決了我在導航回視圖控制器后向下移動的問題。

我設法解決了第一個問題。 看起來桌面視圖沒有考慮到UIToolbar的44個點。

prepareForSegue:保存tableview偏移量prepareForSegue:將其保存在CGPoint屬性中)

self.tableViewScrollOffset = self.tableView.contentOffset;

然后,在viewWillAppear: ,檢查它是否已被修改。 如果是,請恢復它。

if(self.tableView.contentOffset.y != self.tableViewScrollOffset.y) {
        [self.tableView setContentOffset:self.tableViewScrollOffset];
        self.tableViewScrollOffset = CGPointZero;
    }

這種行為確實是iOS 8.x中的一個錯誤。

到目前為止給出的所有答案都無法真正解決問題。 問題是,當正在重新繪制表格時,iOS會忘記(或不會)考慮先前計算的單元格大小,例如在推送視圖時。

解決這個問題的一種方法可以在這里找到: UITableView布局弄亂推送segue和返回。 (iOS 8,Xcode beta 5,Swift) (所以這個問題甚至與這個問題重復)。

但是,提供的解決方案存在過度殺傷,並且存在某些情況導致此緩存失敗(例如,不考慮UIContentSizeCategoryDidChangeNotification)

但是有一個非常簡單的解決方案,即使它很奇怪:

如果您在didSelectRowAtIndexPath中使用手動performSequeWithIdentifier ,只需在之前添加[self.tableView reloadData]

如果您正在使用單元格中的IB seque,只需在prepareForSeque代碼中添加[self.tableView reloadData]

這就解決了這個問題的原因是,這將迫使iOS重新估計可見單元格,因此它不再將內容滾動到另一個位置。 幸運的是, tableView reloadData在這里不需要太多開銷,因為只會重新估計可見單元格。

只是一個預感,你有一個流氓scrollToRowAtIndexPath:atScrollPosition:animated徘徊?

我也面臨着這個問題。 我設法找到了它。 在我的情況下的原因是tableview標題高度是基於計算的文本和文本高度是負的,因為即使contentinset和scrollinset為零,tableview正在向下移動。

這只是第一次發生。 下次計算正確。 我發現一個令人厭倦的事情是當A類(有tableview)從init推送另一個B類時。 當打開B類鍵盤時,調用A類的viewDidLoad。 在從導航控制器卸載B類之前。 為A類重新加載Tableview

如上所述設置automaticAdjustsScrollViewInsets既不起作用,也不起作用,也沒有設置tableViewScrollOffset。

因此提出了一個對我有用的解決方法。

解決方法是添加一個高度為1px且寬度為320px的虛擬UIView,並將其放在“頂部布局指南”和UITableView之間。 可以將此視圖的背景設置為清除,以使其不可見。

現在使用Autolayouts,將Dummy View的頂部修復為Top。 現在設置tableview的關於Dummy View的頂部約束。 發現這解決了tableview的錯位問題。

已提供虛擬視圖的屏幕截圖以及自動布局約束以便於參考。 虛擬視圖已設置為更大的高度和紅色背景顏色僅用於說明目的。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM