Đố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?
Đố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?
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.
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. =) –
Ý tưởng tuyệt vời, cảm ơn Jim! –
Điều này có hơi chậm không? – mattsven
Nếu nó triển khai giao thức NSCopying
, thì phương pháp -copy
sẽ thực hiện thủ thuật.
Tôi đang cố gắng sao chép UIButton. Ý tưởng nào? –
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.
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?
Để 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];
}
}
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 ... –
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ó. –
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