2009-07-07 26 views
21

Đối tượng kế thừa từ NSObject.Làm thế nào để sao chép một UIButton trong mục tiêu C?

Có phương pháp tạo bản sao của nó làm đối tượng mới không?

+2

Tại sao các bạn cố gắng sao chép một UIButton? Có thể có một con đường tốt hơn ... –

+3

Có một nhược điểm nào để sao chép UIButton không? Tôi cần phải tự động tạo các nút mới dựa trên một nút hiện có. –

+0

Bạn sao chép một nút để thực hiện, nói, một hàng nút. @ JamesSkidmore Đây là mã đầy đủ http://stackoverflow.com/a/26438692/294884 – Fattie

Trả lời

63

UIButton không phù hợp với NSCopying, vì vậy bạn không thể tạo một bản sao qua -Copy.

Tuy nhiên, nó không phù hợp với NSCoding, vì vậy bạn có thể lưu trữ bản sao hiện tại, sau đó hủy lưu trữ 'bản sao'.

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button]; 
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 

Sau đó, bạn sẽ phải chỉ định bất kỳ thuộc tính bổ sung nào không được chuyển trong lưu trữ (ví dụ như người được ủy quyền) nếu cần.

+6

Thông minh! Tôi đã có lẽ chỉ cần thêm bản sao thông qua một thể loại, nhưng điều này là tốt hơn. =) –

+0

Ý tưởng tuyệt vời, cảm ơn Jim! –

+2

Điều này có hơi chậm không? – mattsven

0

Nếu nó triển khai giao thức NSCopying, thì phương pháp -copy sẽ thực hiện thủ thuật.

+0

Tôi đang cố gắng sao chép UIButton. Ý tưởng nào? –

0

Bạn có thể tìm thêm thông tin về phương pháp -copy và cách thức hoạt động với các đối tượng phụ trên trang web tham khảo ADC. Như Stephen Darlington đề cập, bạn cần triển khai giao thức NSCopying trong đối tượng của mình.

documentation

4

UIButton không tuân theo giao thức NSCopying, vì vậy bạn đã sao chép thủ công bằng tay. Mặt khác, nó không phải là một điều xấu, vì nó không phải là chính xác rõ ràng có nghĩa là gì để sao chép một nút. Ví dụ: liệu nó có nên thêm bản sao nút vào cùng một chế độ xem gốc trong đó không? Nó có nên bắn các phương pháp tương tự khi khai thác không?

3

Để thêm vào câu trả lời của Jim ở trên sử dụng một loại

@implementation UIButton (NSCopying) 

- (id)copyWithZone:(NSZone *)zone { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 
    return buttonCopy; 
} 

@end 

nếu bạn muốn sao chép tất cả các hành động từ một nút khác, thêm một cái gì đó như thế này:

for (id target in button.allTargets) { 
    NSArray *actions = [button actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
    for (NSString *action in actions) { 
     [newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside]; 
    } 
} 
Các vấn đề liên quan