2015-06-14 181 views
6

我有一個scrollView,我添加了refreshcontroll它。Swift從超級視圖刪除子視圖

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 
在刷新方法我得從滾動視圖中刪除所有子視圖,然後重新填充滾動型

..

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 

後,我試圖去拉,我的滾動視圖獲得新的數據,但它不再有更新控制。我認爲這是因爲當我從我的scrollview刪除子視圖我也從它刪除refreshcontroll。 (如果我再次在我的刷新方法中添加refreshcontroll我的scrollview將再次有refreshconroll)但還有另一個問題。刷新我的滾動視圖向下移動後..我連接到圖片:

這是我如何刪除subiews:

func refresh(sender:AnyObject) 
{ 
    //remove all subviews from scrollview.. 
    let subViews = self.scrollView.subviews 
    for subview in subViews{ 
     println("for removing...") 
     subview.removeFromSuperview() 
    } 

    println("refresh called..") 
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
    //remove all elements from the array 
    tstFrames.removeAll(keepCapacity: false) 
    //refresh data from webservice and adding it to tstFrames Array 
    wsServiceFeedTst() 
    //adding items to the scrollview from tstFramesArray 
    addPosts() 
    self.refreshControl.endRefreshing() 

} 

這是怎麼滾動視圖看起來像清爽之前: enter image description here

的,這是清爽後的樣子: enter image description here

有沒有人可以幫我解釋爲什麼會這樣下去?

謝謝!

謝謝你,這是解決方案:

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    println("for removing...") 
    if (subview is PostLineItem) { 
     subview.removeFromSuperview() 
    } 
    else { 
     println("not removing..") 
    } 
} 
+0

你可以發佈你用來刪除子視圖的代碼嗎? –

+0

我在問,因爲你可能會刪除刷新控制器和佈局限制... –

+0

謝謝!檢查我更新的問題..是佈局約束還子視圖? :) – solarenqu

回答

14

通過刪除所有子視圖,你也可以去除比你明確地添加的,如刷新視圖和佈局的制約等子視圖。

(並回答評論你的問題,佈局約束其實可以子視圖我介紹瞭如何刪除所有子視圖除了佈局約束此:https://stackoverflow.com/a/27281242/2274694

在一般情況下,我建議改變你的代碼更具體,只有你添加的觀點被刪除。例如,你可以一個標記添加到您在addPosts方法中添加子視圖:

post.tag = 1000 

然後刪除只與標籤子視圖中refresh:

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    if subview.tag == 1000 { 
     subview.removeFromSuperview() 
    } 
} 

,以確保你不刪除你自己沒有明確添加的子視圖。

編輯:原來,OP的添加子視圖都是自定義類型PostLineItem,這樣的標籤是不必要的,因爲我們可以只刪除所有PostLineItem!而非:

for subview in self.view.subviews { 
    if subview is PostLineItem { 
     subview.removeFromSuperview() 
    } 
} 
+0

讓子視圖= self.scrollView.subviews 在子視圖子視圖{ 的println( 「去除...」) 如果(子視圖是PostLineItem){ subview.removeFromSuperview() } 其他{ 的println( 「不刪除..」) } }這是解決方案! :) – solarenqu

+0

@solarenqu是的,這更好,因爲你添加的子視圖顯然都是'PostLineItem'類型。 –

+0

@LyndseyScott我可以創建一個UIView()添加到scrollview中,並將所有的子視圖添加到這個UIView,然後當我想刪除所有的子視圖,我可以刪除這個UIView? –

3

我偶然發現了今天這個問題,以及並希望分享我的解決方案。您可以在swift中使用以下UIView擴展名刪除視圖的所有子視圖(及其子視圖)。此外,我附加了一個解決方案,以同樣的方式去除所有約束。

extension UIView { 

    // Recursive remove subviews and constraints 
    func removeSubviews() { 
    self.subviews.forEach({ 
     if !($0 is UILayoutSupport) { 
      $0.removeSubviews() 
      $0.removeFromSuperview() 
     } 
    }) 

    } 

    // Recursive remove subviews and constraints 
    func removeSubviewsAndConstraints() { 
    self.subviews.forEach({ 
     $0.removeSubviewsAndConstraints() 
     $0.removeConstraints($0.constraints) 
     $0.removeFromSuperview() 
    }) 
    } 

} 

第一個解決方案將保留所有約束上,看到Lyndseys答案。請注意,此解決方案將刪除UIView下的整個層次結構。如果你只想刪除特定的子視圖交換或擴展像這樣:

if !($0 is UILayoutSupport) && !($0 is PostLineItem) 
相關問題