2012-06-15 51 views
4

我正在嘗試查找所有在視圖中的視圖並將它們添加到我的內容視圖中。從一個視圖中移除視圖並將其添加到另一個視圖

這是我有什麼,它成功地將刪除self.view視圖,但它並沒有將它添加到self.contentView

for (UIView *view in self.view.subviews) { 
    if (view.tag != 666) { 
     [view removeFromSuperview]; 
     [self.contentView addSubview:view]; 
    } 
} 

任何幫助,將不勝感激。

+0

你檢查'self.contentView'鏈接到筆尖,而不是'nil'? – tia

+0

self.contentView被繼承。它不是來自一個筆尖。 –

回答

0

我不確定這是否可行,但請嘗試切換[view removeFromSuperview];[self.contentView addSubview:view];。這是因爲根據UIView Class ReferenceremoveFromSuperview會導致超級視圖釋放視圖。

希望這會有所幫助!

+1

而不是我會建議做 [查看保留]; [view removeFromSuperview]; [self.contentView addSubview:view]; [查看發佈]; 僅僅因爲調用removeFromSuperview當視圖有2個超級視圖時可能會很奇怪地結束 –

+0

你可能是對的。事實上,它在類參考中提到了類似的東西。謝謝 – pasawaya

+1

而不是兩者之一,如何評論刪除。添加到新的超級視圖會覆蓋超級視圖屬性。但很有可能,問題在於新父母由於某種其他原因而不是零或隱藏。 – danh

0

檢查錯誤。 你最好打印這些視圖的框架(self.view,self.contentView)。 並使它們有不同的顏色。 然後您可以看到這些錯誤。 祝你好運!

0

contentView不屬於UIVew的財產。它屬於UITableViewCell的財產。它返回單元對象的內容視圖。

+0

這不是一個UITableViewCell,我自己創建了contentView,它不是繼承的。 –

0
for (UIView *v in innerMainView.subviews) 
    { 
     [v removeFromSuperview]; 
    } 
    [innerMainView addSubview:StandardView]; 
0

您可以將指定的視圖設置爲屬性,也可以在將視圖從超級視圖中刪除之前將視圖添加到內容視圖。我不確定何時刪除視圖,如果視圖的保留計數減少到0,它將調用超級視圖來解除分配。

+0

我將其從superView中刪除後,保留計數仍爲1。 –

4

代碼中的問題是,當您調用removeFromSuperview時,視圖將由父視圖釋放。不需要調用removeFromSuperview,只需將其添加爲另一個視圖的子視圖就會將其從當前parentView中刪除。

所以使用:

for (UIView *view in self.view.subviews) 
{ 
    if (view.tag != 666) 
    { 
     [self.contentView addSubview:view]; 
    } 
} 

根據UIView Class Reference

addSubview

添加一個視圖以子視圖的接收者的列表的末尾。

- (void)addSubview:(UIView *)view

參數

視圖

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. 

討論

此方法保留視圖,並將其下一個應答器的接收r, 這是它的新超級景觀。

視圖只能有一個超級視圖。如果視圖已經有超級視圖,並且該視圖不是接收者,則在使接收者成爲其新的超級視圖之前,此方法移除先前的超級視圖。

0

當您從superView刪除您認爲它將releasememory。所以你的情況,你需要這樣做:

UINib *infoNib = [UINib nibWithNibName:@"YourXIBFileName" bundle:nil]; 

NSArray *topLevelObjects = [infoNib instantiateWithOwner:self options:nil]; 

UIView *infoView = [topLevelObjects objectAtIndex:0]; 
for (UIView *view in infoView.subviews) { 
     [self.contentView addSubview:view]; 
    } 
} 
相關問題