2017-03-22 25 views
4

當前設置用於與一個UITextView

小區初始滯後我有一個自細胞,從XIB,其中大部分空間都被覆蓋的UITextView加載。此外,該單元格可能有幾個文字瀏覽。並且在這個單元格內還有幾個元素(一個UIView + 2個UILabels)。

的問題

我試圖消除所有這些觀點和滯後停留,即使我只有一個TextView的。而且,滯後只是第一次發生。之後,當我向下滾動並跑入另一個帶有textview的單元格時,滯後不會發生。

附加信息

與此自定義單元格的事情是,一個TextView添加到UIStackView。在開始時,stackview是空的,因爲我不知道(在開發時)有多少textview可能/應該在那裏。

我知道這是另一件可能會影響性能的東西,但我已經通過檢查在出列單元格時stackview的arrangedSubviews數組中已經找到了多少文本視圖來解決它(我想盡可能最好),以及基於這些信息,我只是適當地添加或隱藏視圖(而不是每次摧毀並重新創建所需數量的文本視圖)。

我已經嘗試過使用儀器,但我沒有注意到我的任何類都佔用CPU時間,而是由框架在內部調用的一些UIKit方法調用是造成這種情況的原因......如果需要,我可以發佈截圖,但我想這不是相關的,因爲那些框架調用似乎是通常的系統&。另外我正在測試iPad 2:D,所以也許這是一件事情(我必須爲慢速設備優化應用程序)。

不過,我想我可以優化這個莫名其妙?

的了myCell類是相當簡單的(僞代碼):

class MyCell:UITableViewCell{ 

    func configure(data:SomeData){ 

     self.addOrHideViewsIfNeeded() 
    } 

    private func addOrHideViewsIfNeeded(){ 
     //here, I check if stackview.arrangedSubviews has, and how many subviews are there, and 
     //add/hide them appropriately, means if I have to add them, I load them from the nib, otherwise, I reuse views from by adding them/removing them from a pool. 
    } 
} 

而且滯後處於調試版本比較Release版本,其中意義更加noticealbe,但它仍然是明顯的。

+0

哦,是的,文本視圖最初從一個筆尖加載並使用系統字體,而不是自定義字體。 – Whirlwind

+0

我不認爲這是由於'UITextView'。根據我的經驗以及可以在線閱讀的內容,「UIStackView」雖然非常方便,但性能較差。複雜的AutoLayout規則也需要一些時間來計算。在我們的應用程序中,我們在單元上有20個組件,並且有很多約束條件,即使在較新的設備上也存在可見的滯後。我們通過切換到手動佈局來解決這個問題 - 我們在單元layoutSubviews中自己計算框架。雖然我意識到這可能意味着代碼中的很多更改,但可能值得一試。 – Losiowaty

+0

@Losiowaty嗯,事情是,我在我的表格視圖中有不同類型的單元格。裏面的每個單元格都有uistackview。只有文本視圖的單元格第一次滯後。但正如我所說,滯後來自Mac的硬盤,而附加在調試器上。如果應用程序未通過USB電纜連接,則沒有(可見的)延遲。但是,堆棧視圖並不是高性能的。 – Whirlwind

回答

1

確定這是我的想法做預壓,從用戶的角度來看的tableview行零一個無形的草圖。

class MyCell : UITableViewCell { 
    static var initiallyPreloaded : Bool = false 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     if !MyCell.initiallyPreloaded { 
//Do the initial preloading setup by adding UITextView to self.contentView 
      MyCell.initiallyPreloaded = true 
     } else { 
//Setup the regular cell content otherwise 
     } 
    } 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 

class ViewController: UIViewController , UITableViewDelegate { 
    func tableView(_ tableView: UITableView, 
        cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
     var cell: MyCell? = tableView.dequeueReusableCell(withIdentifier: "myCellIdentifier") as! MyCell? 
     if cell == nil { 
      cell = MyCell(style: .default, reuseIdentifier: "myCellIdentifier") 
     } 
     if indexPath.row == 0 { 
//Display the initial cell in unnoticeable to user way (start with hidden/alpha zero) 
//For this zero-th row the initial preloading should happen 
     } 
     return cell! 
    } 
} 
+0

我只需要在單元初始化時添加'UITextView',而不是在單元初始化後執行。我也必須在'awakeFromNib()'中做到這一點,因爲我正在訪問單元格出口(文本視圖不是實際添加到'contentView'中,而是我在問題中提到的stackview中)。所以,不需要無形的細胞。無論如何,你幫助我找到解決問題的辦法。 – Whirlwind

+0

很高興聽到。在我的情況下,我開始了一種看不見的動畫,這通常會在第一次出現時就落後。如果你使用接口構建器,正確的'awakeFromNib()'是一種方法。 –

2

您可能需要檢查是否重新使用單元格。

可以如下重複使用它:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NAIndexPath *) indexPath{ 

static NSString *cellIdentifier = @"Mycell"; 

cell = [tableView dequeueCellWithIdentifier:cellIdentifier]; 

if(cell == nil) 
    cell = [[MyCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: cellIdentifier]; 
} 
+0

我在我的'viewDidLoad()'中使用tableview的'register(_nib:UINib?,forCellReuseIdentifier identifier:String)'註冊了nibs。另外,我在'cellForRowAt'委託方法中放置了一個斷點,單元格不是零,而是正確地出列。事情是,只有當我在調試器上時,滯後纔會發生。我錯了,當我在發佈模式下在實際設備上運行應用程序而沒有將其附加到debuger時,我沒有任何延遲。但你有我的讚賞,因爲你的答案一般可能會有所幫助。 – Whirlwind