2015-06-14 4 views
6

У меня есть scrollView, и я добавил в него refreshcontroll.Swift remove subviews from superview

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, затем заселить Scrollview ..

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. Я думаю, это потому, что, когда я удаляю subviews из моего scrollview, я также удаляю refreshcontroll из него. (если я снова добавлю refreshcontroll в мой метод обновления, у моего scrollview снова будет refreshconroll). Но есть и другая проблема. После обновления моего Scrollview двигаться вниз .. я прилагается к изображениям:

Это, как я удалить 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() 

} 

Это как Scrollview выглядеть перед обновлением: 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

спасибо! проверьте мой обновленный вопрос .. являются ли ограничения макета также subviews? :) – 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() 
    } 
} 

, чтобы убедиться, что вы не удалите любые подзаголовки, которые вы явно не добавили.

Edit: Оказывается, добавил подвиды ор являются все пользовательского типа PostLineItem поэтому теги не нужны, так как мы можем просто удалить все PostLineItem S вместо:

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

пусть подвиды = self.scrollView.subviews для подвида в подпанелях { Println ("для удаления ...") если (подтаблицы являются PostLineItem) { subview.removeFromSuperview() } еще { Println («не удалять ..») } } это решение! :) – solarenqu

+0

@solarenqu Да, это даже лучше, так как ваши добавленные subviews, по-видимому, все типа 'PostLineItem'. –

+0

@ LyndseyScott Могу ли я создать UIView(), который будет добавлен в scrollview, и все подпункты будут добавлены в этот UIView, а затем, когда я захочу удалить все подзоны, я могу просто удалить этот UIView? –

3

Я споткнулся об этой проблеме сегодня, а также и хотел бы поделиться своим решением. Вы можете удалить все подпункты представления (и их подвид) со следующим расширением UIView в swift. Кроме того, я приложил решение для устранения всех ограничений одинаково.

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)