2014-10-12 49 views
0

我已經創建了UITableView有很多靜態UITableViewCell s。我已經將這些靜態單元格中的一個樣式更改爲「自定義」。我爲這個單元格創建了一個插座,以便我可以編程方式將子視圖添加到它的contentView。在viewWillAppear中,我創建了一個UILabel並對其進行了適當的配置。然後我測試一些條件,如果它是真的,我創建一個UIView並添加UILabel作爲子視圖,然後我將UIView添加到單元的contentView。如果不是這樣,我只需將UILabel本身添加到contentView如何重新創建一個UIView的UITableViewCell的contentView

這項功能在單元格第一次出現時效果很好,但是如果我執行push segue然後導航回去,contentView不會重置,因此它看起來與第一次出現時相同。它應該已經改變,因爲檢查的條件已經改變。我知道這是因爲它只是添加了另一個子視圖。所以我巧妙地在UIViewUILabel創建時巧妙地添加了一個tag,然後在運行代碼以創建適當的視圖之前,我從超級視圖中刪除了該視圖,該視圖爲tag。我還存儲了對UILabel(不是UIView)的引用,所以我將其設置爲nil

最終結果是單元格在第一次呈現時顯示得很好,但從push segue返回後,子視圖按預期被刪除,但未添加另一個子視圖,因此單元格完全爲空。我瀏覽了代碼,它全部被調用,所以我不確定爲什麼在第一次刪除它之後沒有任何東西出現。

編輯:這必須是autoresizingMask的問題 - 設置框架手動工作。我怎樣才能確保框架始終填充父框架?

//Store reference to UILabel and bool to test again 
var label: UILabel? 
var someCondition = false 

//viewWillAppear: 
cell.contentView.viewWithTag(100)?.removeFromSuperview() 
label = nil 

//This is the issue - frame is always size 1,1 
//label = UILabel(frame: CGRectMake(5, 5, 70, 20)) 
label = UILabel(frame: CGRectMake(0, 0, 1, 1)) 
label!.autoresizingMask = .FlexibleWidth | .FlexibleHeight 

label!.text = "testing" 
label!.backgroundColor = UIColor.whiteColor() 

someCondition = !someCondition 
if someCondition == true { 
    var view = UIView() 
    view.backgroundColor = UIColor.redColor() 
    //need to replace static frame with autoresizingMask here too 
    view.frame = CGRectMake(10, 10, 200, 70) 
    view.tag = 100 
    view.addSubview(label!) 
    cell.contentView.addSubview(view) 
} else{ 
    label!.tag = 100 
    cell.contentView.addSubview(label!) 
} 

回答

0

我無法複製出類似於您的代碼的問題。我用下面的代碼對它進行了測試。我在細節控制器中有一個unwind segue,它調用cameBackFromDetail,正如你所看到的,它只是否定了Bool的值。當我來回走動時,我發現細胞在具有標籤的視圖的單元格或標籤之間交替。另一方面,如果我回去使用後退按鈕,我會看到與我離開時相同的單元格,就像我應該那樣。

class TableViewController: UITableViewController { 

    @IBOutlet weak var cell: UITableViewCell! 
    var label: UILabel? 
    var someCondition: Bool = false 

    override func viewWillAppear(animated: Bool) { 
     if let aView = cell.viewWithTag(100) { 
      aView.removeFromSuperview() 
      label = nil 
     } 
     label = UILabel(frame: CGRectMake(5, 5, 70, 20)) 
     label!.text = "testing" 
     label!.backgroundColor = UIColor.whiteColor() 
     if someCondition == true { 
      var view = UIView() 
      view.backgroundColor = UIColor.redColor() 
      view.frame = CGRectMake(10, 10, 200, 70) 
      view.tag = 100 
      view.addSubview(label!) 
      cell.contentView.addSubview(view) 
     }else{ 
      label!.tag = 100 
      cell.contentView.addSubview(label!) 
     } 
    } 


    @IBAction func cameBackFromDetail(segue: UIStoryboardSegue) { 
     someCondition = !someCondition 
    } 

} 
+0

謝謝你試試這個!我發現這個問題,這與添加/刪除視圖或標籤無關。問題不在於將幀設置爲固定大小,而是使用自動調整大小蒙版,並且不能正常工作 - 不知道爲什麼。我將用顯示問題的代碼編輯問題。 – Joey 2014-10-12 17:30:09

+0

@Joey,是的,我注意到了這一點,這就是爲什麼我的代碼中沒有這一行。 – rdelmar 2014-10-12 17:31:11

+0

當,我需要這個框架來調整,以始終填充父項。我認爲這會起作用,很奇怪。我將如何實現這一目標? – Joey 2014-10-12 17:36:19