2013-03-14 84 views
5

(ảnh chụp màn hình dưới đây sẽ giúp giải thích những gì tôi đang cố gắng để làm)Làm cách nào để sao chép/sao chép một số loại UIView cho iOS?

Ý tưởng đằng sau này là tôi có một UIView, với nhiều UI yếu tố khác nhau bên trong, ví dụ, giả sử tôi có một UIView, và bên trong đó chúng tôi có một số UILabel.

Bây giờ tôi muốn nhân bản UIView (với nhãn bên trong) NHƯNG bằng cách nào đó sau đó tôi cần có thể thực hiện thay đổi đối với nhãn, ví dụ: thay đổi thuộc tính văn bản.

Lý do tôi cần một cái gì đó như thế này là vì vậy tôi có thể cấu trúc các UIView với mọi thứ tôi cần trong nó trông đẹp, nhưng thực sự có dữ liệu khác nhau với các bản sao khác nhau của nó.

Tôi không chắc chắn đây là cách tiếp cận tốt nhất, nhưng đó là cách duy nhất tôi có thể đưa ra. Nếu bất cứ ai có bất kỳ ý tưởng về làm thế nào để làm điều này, hoặc bất kỳ ý tưởng về một cách tiếp cận tốt hơn tôi thực sự sẽ đánh giá cao nó. Rất nhiều! Screenshot to make it easier to understand

Trả lời

6

Đây là một điều rất tự nhiên và hữu ích để làm. Những gì bạn đang tìm kiếm là một bộ điều khiển xem bộ chứa. Đặt "ô" có thể tái sử dụng của bạn vào bộ điều khiển chế độ xem của riêng nó và tệp nib của riêng nó. Sau đó, trong bộ điều khiển chế độ xem gốc, hãy sử dụng addChildViewController: để thêm bao nhiêu tùy chọn này theo ý bạn và định cấu hình từng bộ lọc. Họ có thể có IBOutlets riêng của họ mà bạn có thể sử dụng để sửa đổi nội dung.

Điều này rất giống với mẫu được sử dụng bởi UITableViewUITableViewCell (nó không sử dụng "bộ điều khiển chế độ xem con" cụ thể, nhưng nó sử dụng mẫu này).

Để biết chi tiết đầy đủ, hãy xem "Creating Custom Container View Controllers" trong Hướng dẫn lập trình điều khiển chế độ xem dành cho iOS.

Lưu ý rằng Storyboard bao gồm "Chế độ xem vùng chứa" làm tùy chọn trong các mẫu đối tượng để làm điều này dễ dàng hơn.

Nếu bạn muốn truy cập thấp cấp, bạn cũng có thể làm điều này bằng tay sử dụng UINib để tải tập tin nib và dây cửa hàng của nó (và đây là cách chúng tôi sử dụng để làm điều đó trước khi iOS 5), nhưng hôm nay tôi sẽ sử dụng bộ điều khiển xem con.

+0

Thật tuyệt vời! Tôi nghĩ đây là giải pháp! : D –

+1

Từ quan điểm thiết kế, nếu đó là ô có nhãn trong đó, có bộ điều khiển chế độ xem riêng cho âm thanh khá giống với mức quá mức (có thể đó là lý do tại sao UITableView không làm điều đó) –

+1

Tôi nghĩ cho sản phẩm cuối cùng tôi đang phát triển sẽ có nhiều hơn một chút so với 'UILabel'. Tôi có lẽ sẽ cần một vài trong số họ, và một 'UIImage', có thể một hoặc hai thứ khác. –

7

Cá nhân tôi nghĩ câu trả lời hay nhất là tạo riêng từng chế độ xem và định cấu hình khi cần. Bạn có thể tạo một phương thức chỉ cần cấu hình UIViews mới để trông giống nhau và chuyển từng khung nhìn qua nó.

Tuy nhiên, nếu bạn thực sự cần phải sao chép một UIView, bạn có thể lưu trữ nó, và sau đó huỷ lưu trữ nó:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 
UIView *myView = (UIView *)copyOfView; 
[self.view addSubview:myView]; 

Nếu bạn có một bó trong số này, chắc chắn rằng bạn đang sử dụng thời gian profiler Instruments để kiểm tra hiệu quả vẽ của bạn.

+0

Cảm ơn vì điều đó! Có vẻ như một cách khá thú vị để làm điều đó, vì vậy chỉ cần được rõ ràng, những gì bạn đang nói là tôi tạo ra (và cấu hình) xem của tôi, lưu trữ nó, sau đó bỏ lưu trữ nó? Ngoài ra, bạn có thể liên kết tôi với một tài nguyên hoặc giúp tôi với một số mã khi nói đến việc lưu trữ chế độ xem không? –

+0

Mã ở trên đang thực hiện cả lưu trữ và hủy lưu trữ. Lưu ý việc sử dụng "NSKeyedArchiver" và "NSKeyedUnarchiver" trong cùng một dòng. Đây là cách kinh điển để tạo một bản sao sâu của bất kỳ đối tượng có thể lưu trữ nào. –

+0

Ahh Tôi hiểu rồi, vâng, điều đó có ý nghĩa hơn rất nhiều! –

0

Nếu bạn chỉ có một nhãn bên trong, giải pháp hiển nhiên là có lớp con UIView tùy chỉnh với nhãn đó được thêm làm chế độ xem phụ. Mỗi khi bạn cần một khung nhìn mới, bạn tạo một thể hiện của lớp con tùy chỉnh của bạn và đặt văn bản nhãn. Nếu bạn có nhiều thứ để thiết lập, một số trong số đó là phổ biến cho tất cả các khung nhìn lớp con tùy chỉnh của bạn, bạn có thể sử dụng mẫu thiết kế mẫu thử nghiệm, nó khá thẳng về phía trước để thực hiện.

+0

Ahh tuyệt vời! Yeah nghe có vẻ như là một cách tuyệt vời để làm điều đó. Đã không nghĩ về nó (vẫn còn mới cho toàn bộ điều iOS) Tôi nghĩ rằng tôi sẽ cung cấp cho một thử. –

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