8

Tôi có một lớp con của UICollectionViewCell. Các tế bào được thiết kế trực quan trong kịch bản với rất nhiều thành phần và các thành phần này được ràng buộc với các biến trong lớp con Swift bằng cách sử dụng bảng phân cảnh.Cách khôi phục các ràng buộc trong UICollectionViewCell sau khi được giải mã

Lớp Swift chỉ cung cấp logic để điền các thành phần từ dat được truy xuất từ ​​nguồn dữ liệu.

Ví dụ:

class InfoCollectionViewCell : UICollectionViewCell { 

    @IBOutlet weak var mainPanel : UIView! 
    @IBOutlet weak var panel1 : UIView! 

    @IBOutlet weak var firstName : UILabel! 
    @IBOutlet weak var lastName : UILabel! 
    @IBOutlet weak var address : UILabel! 
    etc ... 

    func setVariousProperties(etc) { 
     firstName.text = ... etc 

Các dữ liệu mã nguồn không điều thông thường:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell { 
    c.setVariousProperties(...) 
} 

tôi ban đầu chỉ thực hiện giải mã/phương pháp mã hóa có chứa một "không được thực hiện" sự khẳng định, nhưng nó trở nên rõ ràng đôi khi khung công tác mã hóa và giải mã lớp. Tôi đã triển khai các phương thức mã hóa/giải mã giả mà không lưu các thành phần dẫn đến các vấn đề có thể dự đoán được với các giá trị nil khi các thành phần được truy cập.

Vì vậy, có vẻ như tôi bắt buộc phải triển khai mã hóa và giải mã tất cả các điều khiển trong từng lớp con một, hoặc tôi phải tìm cách tốt hơn.

Có vẻ như lãng phí thời gian vì tôi không thực sự cần (tôi không nghĩ) để lưu nội dung của các thành phần vì chúng sẽ chỉ được sử dụng lại bởi lớp con: Tôi sẽ ghi đè lên nội dung thành phần sẽ có giá trị từ nguồn dữ liệu.

Rõ ràng, tất cả các điều khiển được xác định trong bảng phân cảnh. Tôi có thể lấy chúng theo cách thủ công bằng tên từ bảng phân cảnh theo phương pháp init, nhưng điều đó có vẻ kém tẻ nhạt và làm cho liên kết đồ họa của các điều khiển và các biến dư thừa.

Có cách nào tốt hơn không?

Tôi có thể chỉ nói "khôi phục kết nối" hoặc nội dung tương tự không?

EDIT:

Một nơi nào đó giữa đăng câu hỏi và thêm tiền thưởng, vấn đề ngừng xảy ra. Bây giờ tôi nhận thấy rằng phương pháp mã hóa của các thành phần của tôi không được gọi. Vì một lý do nào đó, khung công tác đã quyết định sắp xếp lại các đối tượng của tôi và deserialise chúng, nhưng bây giờ nó không phải là. Do đó vấn đề không xảy ra và tôi không thể cung cấp stack-trace.

Có thể hiểu rằng một số cập nhật cho XCode đã khắc phục sự cố này hoặc có thể là một vấn đề khác.

Tôi rõ ràng vẫn lo ngại có một số lỗi ẩn ở đâu đó.

+0

Bất cứ ai khác có vấn đề này? Tôi sẽ đánh giá cao ý kiến. – rghome

Trả lời

2

Bạn không cần triển khai mã hóa/giải mã cho bất kỳ điều khiển nào đã được đặt ra và kết nối trong Bảng phân cảnh. Điều này sẽ được thực hiện trong thời gian chạy và bạn sẽ nhận được một ô sau collectionView.dequeueReusableCellWithReuseIdentifier miễn là mọi thứ khác đã được kết nối chính xác với các thành phần giao diện người dùng sẵn sàng để sử dụng.Những điều cần kiểm tra là:

  1. các lớp con được quy định trong phần kịch bản lớp tùy chỉnh
  2. các reuseIdentifier được xác định để phù hợp với chuỗi bạn mong đợi
  3. Tất cả các IBOutlets được kết nối và cũng sẽ hiển thị các kết nối trong mã tiếp theo dòng IBOutlet var.

Khi bạn đã đảm bảo chúng nằm chính xác thử in ra các thành phần để kiểm tra xem họ vẫn bằng không và đặt một số văn bản đơn giản trong đó để loại bỏ bất kỳ vấn đề dataSource:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
    if let c = cell as? InfoCollectionViewCell{ 
     print(c.address) 
     print(c.firstName) 
     print(c.lastName) 

     c.firstName.text = "firstName Test" 
     c.lastName.text = "lastName Test" 
     c.address.text = "address Test" 
    } 
    return cell 
    } 
} 
+0

OK - cảm ơn. Tôi sẽ điều tra thêm một chút. – rghome

+0

Tất nhiên, tôi không thể tái tạo nó ngay bây giờ. Đó là một vấn đề khá dễ tái sản xuất trên một khung nhìn với 100 ô khi một cuộn được thực hiện, nhưng không phải trên các khung nhìn có ít ô hơn và không hiển thị trên màn hình đầu tiên. Tôi đoán một cái gì đó kích hoạt serialization của các tế bào. Nó bây giờ làm phiền tôi rằng có một lỗi liên tục ở đó, như tất cả các đề xuất bạn thực hiện phải được áp dụng anyway, nếu không tôi sẽ không có màn hình đầu tiên của các tế bào làm việc. Các lỗi tôi đã cho thấy rõ ràng rằng init (coder) đã được gọi và rõ ràng rằng các IBOutlets không được nối dây sau khi giải mã. – rghome

+0

Tôi muốn đây là câu trả lời đúng. Tôi chỉ không tin rằng nó là. Như tôi đã nói ở trên, các cuộc gọi mã hóa/giải mã đã ngừng xảy ra vì lý do không xác định. Ngay cả khi nó là một lỗi trong một số phiên bản của IOS (hoặc trong giả lập), tôi không thể chắc chắn rằng nó là cố định trên tất cả các thiết bị. Có vẻ như chiến lược tốt nhất là chơi nó an toàn và thực hiện giải mã và mã hóa cho tất cả các thành phần. – rghome

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