2010-07-12 40 views
5

Về cơ bản tôi muốn xóa tất cả các đối tượng khỏi UIScrollView và tôi chưa tìm thấy giải pháp cho nó vì lệnh "removeAllObjects" đơn giản không hoạt động. Có ai có ý tưởng làm thế nào để làm điều đó?iPhone: Cách xóa tất cả các đối tượng khỏi UIScrollView

+3

Không xóa tất cả các bản xem trước của 'UISubview'. Đó là chế độ xem chỉ báo cuộn là các bản xem trước. Bạn cũng sẽ loại bỏ chúng. Tôi khuyên bạn nên đặt chế độ xem nội dung trong vùng chứa UIView của riêng bạn. (giữ nó như là một ivar để dễ dàng truy cập trong khi thêm và loại bỏ từ nó) – ohhorob

Trả lời

32

Thậm chí dễ dàng hơn:

[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
+0

Tôi đoán bạn có cùng vấn đề với 'makeObjectsPerformSelector' liên quan đến nó lặp qua các bản xem trước trong khi sửa đổi mảng đồng thời. cách này là thanh lịch và được sử dụng bởi nhiều người, nhưng làm thế nào để bạn giải quyết những gì progrmr đưa lên ở trên? – iwasrobbed

+0

Tôi khá chắc chắn makeObjectsPerformSelector: tạo ra một mảng tạm thời trước khi gọi bộ chọn trên mỗi đối tượng. Nếu nó không, như bạn nói, nó sẽ gây ra vấn đề. – Kalle

9

Cách đơn giản nhất:

for(UIView *subview in [scrollView subviews]) { 

    [subview removeFromSuperview]; 

} 
+0

Có an toàn để sửa đổi các nội dung mảng trong khi looping thông qua các yếu tố? Tôi chỉ tự hỏi ... – progrmr

+0

Nói chung nó có lẽ không phải là thực hành tốt nhất, vì vậy bạn có thể muốn thiết lập một mảng tạm thời được đánh dấu để loại bỏ. : P – iwasrobbed

+1

Chắc chắn là an toàn để xóa các bản xem trước khi liệt kê bộ sưu tập phụ của phụ huynh – ohhorob

3

Hai giải pháp sẽ là, mà không cần tháo cuộn:

Thêm một thẻ để tất cả các subviews của bạn, loại bỏ chúng bằng cách sử dụng các thẻ đó.

Thực hiện:

Nơi này trên lớp học của bạn

#define XPScrollViewSubviewStartTag    100 

Khi bạn thêm các đối tượng

for(NSInteger = 0;i<[viewArray count];i++){ 
    UIView* view = [viewArray objectAtIndex:i]; 
    view.tag = XPScrollViewSubviewStartTag + i; 
    [scrollView addSubview:view]; 
} 

Khi sau đó bạn muốn xóa các quan điểm sử dụng

for(UIView* view in [scrollView subviews]){ 
     if(view.tag >= XPScrollViewSubviewStartTag) 
      [view removeFromSuperview]; 
} 

Tạo nên một phong tục UIView lớp

Khi bạn muốn loại bỏ các quan điểm

for(id view in [scrollView subviews]){ 
     if(![view isKindOfClass:[CustomView class]]) 
      continue; 

     //not necessary, but just to make things understandable 
     CustomView* customView = (CustomView*)view; 
     [customView removeFromSuperview]; 
} 
1

giải pháp Oritm là tốt đẹp, nhưng nếu bạn không muốn làm phiền sử dụng các thẻ, bạn có thể loại bỏ chế độ xem bạn muốn loại bỏ từ scrollview. Điều này sẽ giả định rằng bạn biết chế độ xem nào cần xóa. Ví dụ: scrollview của tôi chỉ có UILabels vì vậy khi tôi chạy như sau:

// This will remove the scrollview but the scrollbars will remain 
for (UIView *subview in [self.detailsExpander.scrollView subviews]) { 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UILabel"]) 
     [subview removeFromSuperview]; 
} 

Điều này sẽ chỉ xóa tất cả các nhãn nhưng giữ thanh cuộn (chế độ xem hình ảnh). Lưu ý: thao tác này sẽ không hoạt động nếu bạn muốn giữ các chế độ xem hình ảnh cụ thể trong khi đồng thời bạn muốn giữ các thanh cuộn.

Các vấn đề liên quan