Tại sao cửa hàng của UICollectionViewCell lại không?


143

Tôi đã tạo một UICollectionViewCell tùy chỉnh trong Trình tạo giao diện, liên kết các khung nhìn trên nó với lớp và sau đó khi tôi muốn sử dụng và đặt một chuỗi thành nhãn trên chuỗi, nhãn tha có giá trị không.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

Và ô được phân lớp:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

Có một lý do bạn đang sử dụng "!" Ngoài tên loại ở khắp mọi nơi? Có vẻ dư thừa, đặc biệt trong IBOutlets. Nơi duy nhất có thể có vấn đề là nơi bạn xử lý ô là LeftmenuCollectionViewCell, nhưng bạn không làm điều đó ở đó .. Bạn có thể tự in hoặc in NSLog 'cell' không?
mc01

1
Nếu tôi xóa "!" hoặc dùng "?" trong định nghĩa lớp, tôi nhận được lỗi trình biên dịch hoặc sự cố. "!" là mặc định khi bạn liên kết nó.
János

ant chính tế bào: <xxx.LeftMothyCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; khung = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János

Tất cả các cửa hàng móc nối trong IB? Các cửa hàng khác làm việc? Đừng thấy bất kỳ vấn đề rõ ràng nào khác, xin lỗi.
mc01

Câu trả lời:


310

Tôi đang gọi self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")lại. Nếu bạn đang sử dụng bảng phân cảnh, bạn không muốn gọi nó . Nó sẽ ghi đè lên những gì bạn có trong bảng phân cảnh của mình.

Nếu bạn vẫn còn có việc kiểm tra vấn đề thời tiết reuseIdentifiercùngdequeueReusableCellWithReuseIdentifier trong storyboard.


18
Cảm ơn bạn! Đã dành hơn một giờ cho việc này như là sử dụng một tế bào tùy chỉnh.
DogCoffee

Tôi có cùng một vấn đề nhưng không bao giờ sử dụng dòng mã này, bạn có biết tại sao tôi nhận được cùng một ngoại lệ không?
Dekel Maman

cảm ơn. Điều này đã giải quyết nó cho tôi. tôi đã có một bảng phân cảnh và tôi đã tự thêm một bộ điều khiển xem. mã soạn sẵn bao gồm dòng bạn đã đề cập. mặc dù có vẻ đúng (định danh chính xác & lớp), nó đã từ chối kết nối các cửa hàng. bây giờ nó hoạt động. ngọt!
Joris Weimar

13
Nếu bạn đang sử dụng bảng phân cảnh, bạn không muốn gọi nó. Nó sẽ ghi đè lên những gì bạn có trong bảng phân cảnh của mình. <- Cái này thực sự giúp tôi hết
S A. A.Suk 6/03/2015

6
GAH, thật là một điều kinh khủng trong mẫu UICollectionViewControll !!!!! Cảm ơn, Janos.
Kenny Wyland

53

Chỉ cần xóa dòng này:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
Tôi không hiểu tại sao điều này đã được bỏ phiếu. Đây là câu trả lời cho vấn đề của tôi.
Félix Simões

1
Đây là câu trả lời đúng, và nên được đánh dấu phù hợp bởi người hỏi câu hỏi. Cũng sẽ rất tuyệt để hiểu lý do tại sao nó hoạt động :)
Kiko Lobo

3
Đoán nó đã bị hạ cấp vì câu hỏi đã được trả lời vào chính ngày 14 tháng 8 ... trong khi câu trả lời này chỉ sao chép lại câu trả lời ở đây, sau vài tháng.
Nitin Nain

1
Nhưng khi tôi không sử dụng nó, nó mang lại cho tôi lỗi Assertion thất bại trong - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera

Một lời giải thích cho lý do tại sao dòng này là không cần thiết sẽ được hoan nghênh. Hiện tại, nó được thêm vào bởi bảng mã Xcode cho chế độ xem bộ sưu tập mới.
pkamb

47

Nếu bạn đang sử dụng xib, hãy đảm bảo rằng bạn đã thêm dòng mã này vào viewdidload của mình.

Mục tiêu C:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Nhanh:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")

Bạn có phải đăng ký cả lớp và ngòi, hoặc chỉ ngòi là đủ?
RainCast

3
Tôi chỉ cần đăng ký ngòi và nó đã giải quyết vấn đề của tôi.
Amelia

Có vẻ như có hai cách để đăng ký và tôi đã sử dụng sai một ... bộ sưu tập? forCellWithReuseIdentifier: "yourIdentifier")
Sergio

17

Phải đăng ký mà các bạn!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")

6

Có vẻ như có hai cách để đăng ký và tôi đã sử dụng sai cách đầu tiên. Tôi có chế độ xem xib tùy chỉnh để đăng ký với tùy chọn thứ hai và chúng tôi có dữ liệu!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

Tôi đã gặp một vấn đề tương tự, nhưng lỗi của tôi là tôi đã không ủy quyền cho CollectionViewCell để có thể thay đổi văn bản nhãn ..


0

Tôi nghĩ rằng giải pháp tốt nhất là sử dụng trực tiếp từ bảng phân cảnh trong đó thêm một CollectionView, thay vào đó, bạn cần xóa một CollectionViewCelltừ CollectionViewtrong bảng phân cảnh của mình và đăng ký một ô bằng lệnh sau:

bộ sưu tập Xem?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.