2015-06-19 27 views
5

Tôi có khoảng 15 UIButton trong bộ điều khiển của mình. Tôi cố gắng xóa 10 người trong số họ với một vòng lặp đơn giản và có vẻ như tôi đang nhận được một số loại xung đột.Sử dụng thẻ trong Swift

Khi tôi nhấn nút để xóa, tôi nhận được lỗi sau:

Could not cast value of type '_UISizeTrackingView' (0x18a023c) to 'UIButton' (0x1899298). (lldb)

Đối với vòng lặp là:

for var i = 0; i < 9; i++ { 
    button = view.viewWithTag(i) as! UIButton 
    button.setImage(nil, forState: .Normal) 
} 

tôi đã thu hẹp nó xuống để một vấn đề với một mục mà đang sử dụng tag 0. Tôi đã xem xét tất cả các mục trên View Controller Scene của tôi và dường như không tìm thấy bất kỳ xung đột nào. Tôi chỉ thấy nút một bằng cách sử dụng thẻ = 0.

Tôi thậm chí còn confrimed nó bằng cách thay thế 'i' trong vòng lặp với '0' và có cùng một vấn đề. Khi tôi thay thế nó bằng '1' hoặc '2', hoạt động tốt với hình ảnh đơn đó.

Bất kỳ cách nào để xem đối tượng nào đang sử dụng thẻ 0? Tôi đã nhấp vào tất cả (bao gồm cả chính 'Xem') nhưng cant dường như tìm thấy bất cứ điều gì.

Trả lời

9

Như đã có @ranunez nói, thẻ mặc định là 0. Tôi không đồng ý với lời khuyên sử dụng các thẻ khác 0.

Lời khuyên của tôi là, không sử dụng thẻ. Nếu bạn muốn sử dụng chế độ xem trong mã, hãy khai báo một lối thoát cho nó và kết nối nó. Nếu bạn muốn lặp qua nhiều chế độ xem, hãy tạo một mảng từ các cửa hàng của bạn hoặc sử dụng một tập hợp các cửa hàng:

@IBOutlet var buttons: [UIButton]! 
+0

Giải pháp tuyệt vời! – ranunez

+0

Như một phần thưởng thêm, bây giờ chúng ta có thể 'cho in' thông qua những điều này. Tôi không biết về Swift, nhưng trong Objective-C một 'for in' chắc chắn sẽ nhanh hơn so với bản gốc C-style' for' trong câu hỏi. – nhgrif

+0

@Sulthan tại sao mọi người sử dụng cửa hàng nhiều hơn thẻ? Tôi có nghĩa là nó giảm độ dài mã ngay! Tôi có âm thanh tốt hay tôi đang tăng độ phức tạp bằng cách sử dụng thẻ? –

1

Theo mặc định, lượt xem có thẻ là 0, vì vậy bạn không nên dựa vào điều này để xóa đối tượng của mình bằng thẻ 0. Thử đặt các nút của bạn một bộ thẻ khác nhau, ví dụ: 1000, 1001, 1002, vv thay vì