Giả sử (vì lợi ích của đối số) mà tôi có một lớp xem có chứa một NSDictionary. Tôi muốn toàn bộ các thuộc tính, tất cả đều truy cập vào các thành viên của từ điển đó. Ví dụ: Tôi muốn @property NSString* title
và @property NSString* author
.Viết thuộc tính @dynamic của riêng tôi trong Cocoa
Đối với mỗi một trong các thuộc tính này, việc triển khai cũng giống nhau: đối với người khởi động, hãy gọi [dictionary objectForKey:propertyName];
và đối với người đặt làm tương tự với setObject: forKey :.
Sẽ mất nhiều thời gian và sử dụng vô số mã sao chép và dán để viết tất cả các phương pháp đó. Có cách nào để tạo tất cả tự động, chẳng hạn như Core Data có thuộc tính @dynamic cho lớp con NSManagedObject không? Để rõ ràng, tôi chỉ muốn phương tiện truy cập này cho các thuộc tính mà tôi xác định trong tiêu đề, không chỉ bất kỳ khóa tùy ý nào.
Tôi đã đi qua valueForUndefinedKey: như một phần của mã hóa giá trị khóa, có thể xử lý các getters, nhưng tôi không hoàn toàn chắc chắn cho dù đây là cách tốt nhất để đi.
Tôi cần những thuộc tính rõ ràng này để tôi có thể liên kết với chúng trong Trình tạo giao diện: Cuối cùng tôi lên kế hoạch viết bảng IB cho chế độ xem này.
(BTW, tôi biết ví dụ của tôi về việc sử dụng NSDictionary để lưu trữ những thứ này có chút khó hiểu. Tôi thực sự viết một lớp con của WebView và các thuộc tính sẽ tham chiếu đến ID của các phần tử HTML, nhưng điều đó không quan trọng đối với logic của câu hỏi của tôi!)
Chỉ có tinh chỉnh tôi sẽ thực hiện là chỉ viết thường chữ cái đầu tiên (và đảm bảo chuỗi _cmd có ít nhất 5 ký tự): NSString * property = NSStringFromSelector (_cmd); NSString * firstLetter = [[thuộc tính substringWithRange: NSMakeRange (3, 1)] lowercaseString]; property = [firstLetter stringByAppendingString: [property substringWithRange: NSMakeRange (4, [độ dài thuộc tính] - 5)]]; – charles
Ví dụ tuyệt vời. Tôi đã nhận được như là một loại IMP đông lạnh (tức là cho 'setName:' IMP của tôi là 'setValueForName') nhưng việc bạn sử dụng' NSStringFromSelector (_cmd) 'đã cho tôi chính xác cú đá trong chiếc quần tinh thần mà tôi đang tìm kiếm tổng quát điều này thành 'setWhatever:'. Cảm ơn bạn đã viết nó lên. – matt