2009-10-04 27 views
34

Tôi có một phụ huynh UIView với một số phụ đề. Định kỳ tôi cần phải loại bỏ một subview và hoàn toàn loại bỏ nó khỏi hệ thống. cách chính xác để làm điều này là gì? Tôi đã thử điều này:Cách chính xác để xóa một chế độ xem phụ từ một hệ thống phân cấp khung nhìn và nuke là gì?

UIView *v = [self.containerView viewWithTag:[n integerValue]]; 

[v removeFromSuperview]; 

và nhận kết quả kỳ lạ. Trước đây hiện tại cũng có UIView s cũng biến mất. Chuyện gì vậy?

Trả lời

66

Hãy thử điều này:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; 
v.hidden = YES; 
[self.containerView bringSubviewToFront:v]; 
[v removeFromSuperview]; 

Một điều tôi chỉ nhận thấy từ các tài liệu lớp UIView - xem câu cuối cùng:

removeFromSuperview hủy liên kết người nhận từ SuperView và cửa sổ của nó, và loại bỏ nó từ chuỗi trả lời.

  • (void) removeFromSuperview

Thảo luận Nếu SuperView của người nhận không phải là con số không, phương pháp này giải phóng người nhận. Nếu bạn dự định sử dụng lại chế độ xem, hãy nhớ giữ lại chế độ xem trước khi gọi phương thức này và đảm bảo phát hành nó khi thích hợp khi bạn hoàn thành nó hoặc sau khi thêm nó vào một hệ thống phân cấp khung nhìn khác.

Không bao giờ gọi phương thức này khi hiển thị.

CẬP NHẬT: Bây giờ là năm 2014 và xóa một chế độ xem phụ mà không ẩn nó hoạt động hoàn toàn tốt. Mã của người đăng ban đầu phải hoạt động như sau:

UIView *v = [self.containerView viewWithTag:[n integerValue]]; 
[v removeFromSuperview]; 

Điều này sẽ xóa v và mọi chế độ xem mà nó đã đính kèm dưới dạng xem phụ, bỏ lại phía sau container và bất kỳ anh chị em nào của v.

+1

** đáng ngại ** Không bao giờ gọi phương thức này khi hiển thị. – Irwin

+0

không thể dễ dàng hơn, chỉ cần làm điều này như Blackberry nói ** cho (UIView * s trong [xem subviews]) [s removeFromSuperview]; ** – Fattie

+0

Quay lại trong '09, nếu bạn loại bỏ một subview trước khi ẩn nó, bạn có một số kết quả lạ. Hoặc ít nhất đó là những gì tôi đã nhìn thấy, và như vậy là poster ban đầu. Và có được sử dụng để được cảnh báo trong tài liệu tham khảo lớp UIView, đã được thay thế bằng một số khác. Tôi muốn nói rằng phương pháp của poster ban đầu loại bỏ một subview có lẽ bây giờ là chính xác và không cần bất kỳ mã bổ sung. (anh ấy chỉ xóa một tiểu đơn lẻ) – mahboudz

0

Đó là ý tưởng chung phù hợp. những UIViews khác biến mất, mối quan hệ của họ với UIView này là gì? Họ có phải là các bản xem trước của chế độ xem này không? Họ có dealloc'd trong phương thức dealloc của chế độ xem bạn đang xóa không?

Bạn có chắc chắn Thẻ của mình là duy nhất không?

Sujal

+0

Tất cả anh chị em với chế độ xem tôi đang cố xóa ngay lập tức khỏi màn hình. Cai gi? – dugla

+0

Tất cả các anh chị em đều có các thẻ duy nhất, đó là cách tôi tham chiếu đến các khung nhìn. – dugla

0

Có phải họ chỉ biến mất khỏi màn hình, hoặc biến mất khỏi màn hình hiển thị hệ thống phân cấp xem? Trình gỡ lỗi hiển thị cho bạn những gì?

0

Có thể cell.contentView có cùng một thẻ với chế độ xem phụ bạn muốn xóa không? theo chế độ xem documentationViệc loại bỏ thẻ:

Chế độ xem trong thứ bậc của người nhận khớp với thẻ. Người nhận là được bao gồm trong tìm kiếm.

Nếu trường hợp này xảy ra thì bạn có thể vô tình xóa cell.contentView khỏi ô. Nếu n bằng 0 và contentview của ô không có thẻ được đặt thành nó, nó sẽ mặc định là 0 và khiến điều đó xảy ra.

38

Để loại bỏ tất cả các subviews khỏi tầm nhìn của bạn:

for(UIView *subview in [view subviews]) { 
    [subview removeFromSuperview]; 
} 

Nếu bạn muốn loại bỏ một số điểm nhất định thì:

for(UIView *subview in [view subviews]) { 
    if([subview isKindOfClass:[UIButton class]]) { 
    [subview removeFromSuperview]; 
} else { 
    // Do nothing - not a UIButton or subclass instance 
} 
} 

Bạn cũng có thể xóa điểm phụ theo giá trị thẻ:

for(UIView *subview in [view subviews]) { 
    if(subview.tag==/*your subview tag value here*/) { 
     [subview removeFromSuperview]; 

    } else { 
     // Do nothing - not a UIButton or subclass instance 
    } 
} 
+3

Tôi thích điều này tốt hơn câu trả lời được chấp nhận. Nó có vẻ giống như một cách tiếp cận trực tiếp hơn nhiều - và bạn đã khá kỹ lưỡng bao gồm các tùy chọn để chọn bất cứ điều gì ai đó có thể muốn xóa. +1. – GeneralMike

+0

hmm ... thực sự bây giờ tôi đã thử chạy nó, nó không hoạt động. Tôi đang sử dụng tùy chọn isKindOfClass. Tôi có UILabels và UISliders trong UIView của tôi, và tôi đang cố xóa tất cả các thanh trượt, vì vậy tôi có: 'if ([subview isKindOfClass: [UISlider class]]);' và nó trả về true cho mọi thứ, bao gồm các nhãn, nên mọi thứ đều bị xóa. Tôi đã thử thay thế isKindOfClass bằng isMemberOfClass, và điều đó cũng không hoạt động. Có điều gì đặc biệt về UISliders mà sẽ làm cho điều này không hoạt động? – GeneralMike

+0

Đã giải quyết được vấn đề của tôi, tôi đã có một lỗi đánh máy khiến tôi mất nhiều thời gian để tìm kiếm. Mã hoạt động chính xác như được hiển thị ở đây. – GeneralMike

1

Swift 3.0:

let viewToRemove = mySuperView.viewWithTag(myTag) 
viewToRemove?.removeFromSuperview() 
Các vấn đề liên quan