เหตุใดเต้าเสียบของ UICollectionViewCell จึงไม่มี


143

ฉันได้สร้าง UICollectionViewCell ที่กำหนดเองในตัวสร้างส่วนต่อประสานมุมมองที่ถูกผูกไว้กับคลาสและจากนั้นเมื่อฉันต้องการใช้และตั้งค่าสตริงเป็นป้ายกำกับบนสตริงฉลาก tha มีค่าเป็นศูนย์

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
}

และเซลล์ subclassed:

class LeftMenuCollectionViewCell: UICollectionViewCell {

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

มีเหตุผลที่คุณใช้คำว่า "!" ชัดเจนหรือไม่ นอกจากพิมพ์ชื่อทุกที่แล้ว? ดูเหมือนจะซ้ำซ้อนโดยเฉพาะใน IBOutlets สถานที่เดียวที่มันอาจสำคัญคือที่ที่คุณทำการ dequeue เซลล์เป็น LeftmenuCollectionViewCell แต่คุณไม่ได้ทำที่นั่น .. คุณสามารถพิมพ์หรือเซลล์ของ NSLog ได้หรือไม่?
mc01

1
ถ้าฉันลบ "!" หรือใช้ "?" ในการกำหนดชั้นเรียนฉันได้รับข้อผิดพลาดของคอมไพเลอร์หรือผิดพลาด "!" เป็นค่าเริ่มต้นเมื่อคุณผูกมัน
Janos

มดเซลล์เอง: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; frame = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
János

ร้านค้าทั้งหมดติดยาเสพติดใน IB? ร้านอื่นทำงานหรือไม่ ไม่เห็นปัญหาที่ชัดเจนอื่น ๆ ขออภัย
mc01

คำตอบ:


310

ฉันโทรมาself.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")อีกครั้ง หากคุณกำลังใช้กระดานที่คุณไม่ต้องการที่จะเรียกสิ่งนี้ว่า มันจะเขียนทับสิ่งที่คุณมีในกระดานเรื่องราวของคุณ

หากคุณยังมีการตรวจสอบปัญหาอากาศreuseIdentifierเป็นแบบเดียวกันในdequeueReusableCellWithReuseIdentifier และstoryboardใน


18
ขอบคุณ! ใช้เวลามากกว่าหนึ่งชั่วโมงในการนี้เช่นเดียวกับการใช้เซลล์ที่กำหนดเอง
DogCoffee

ฉันมีปัญหาเดียวกัน แต่ไม่เคยใช้รหัสบรรทัดนี้คุณมีความคิดว่าทำไมฉันถึงได้รับข้อยกเว้นเดียวกัน
Dekel Maman

ขอบคุณ นี้แก้ไขได้สำหรับฉัน ฉันมีสตอรีบอร์ดและฉันเพิ่มตัวควบคุมมุมมองด้วยตนเอง รหัสสำเร็จรูปประกอบด้วยบรรทัดที่คุณพูดถึง แม้ว่าจะดูเหมือนถูกต้อง (ตัวระบุที่ถูกต้อง & คลาส) แต่ก็ปฏิเสธที่จะเชื่อมต่อกับร้านค้า ตอนนี้มันใช้งานได้ หวาน!
Joris Weimar

13
หากคุณใช้กระดานเรื่องราวคุณไม่ต้องการเรียกสิ่งนี้ มันจะเขียนทับสิ่งที่คุณมีในกระดานเรื่องราวของคุณ <- อันนี้ช่วยฉันได้จริงๆ
ไม้ A.Suk

6
GAH เป็นสิ่งที่น่ากลัวมากที่มีในเทมเพลต UICollectionViewController !!!!! ขอบคุณ Janos
Kenny Wyland

53

เพียงลบบรรทัดนี้:

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

3
ฉันไม่เข้าใจว่าทำไมเรื่องนี้ถึงลงคะแนน นี่คือคำตอบสำหรับปัญหาของฉัน
FélixSimões

1
นี่คือคำตอบที่ถูกต้องและควรถูกทำเครื่องหมายโดยบุคคลที่ถามคำถาม นอกจากนี้ยังจะดีที่จะเข้าใจว่าทำไมมันทำงาน :)
Kiko Lobo

3
คิดว่ามันลดลงเพราะคำถามถูกตอบในเดือนสิงหาคม 14 เอง ... ในขณะที่คำตอบนี้เพียงแค่คัดลอกคำตอบอีกครั้งที่นี่หลังจากผ่านไปหลายเดือน
Nitin Nain

1
แต่เมื่อฉันไม่ได้ใช้มันทำให้ฉันมีข้อผิดพลาดในการยืนยันความล้มเหลวใน - [UICollectionView _dequeueReuseViewViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera

คำอธิบายว่าทำไมจึงไม่จำเป็นต้องใช้บรรทัดนี้ ขณะนี้มันถูกเพิ่มโดย Xcode สำเร็จรูปเพื่อดูคอลเลกชันใหม่
pkamb

47

หากคุณใช้ xib ตรวจสอบให้แน่ใจว่าคุณได้เพิ่มบรรทัดของรหัสนี้ลงใน viewdidload ของคุณ

วัตถุประสงค์ C:

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

สวิฟท์:

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

คุณต้องลงทะเบียนทั้งคลาสและปลายปากกาหรือแค่ปลายปากกาก็เพียงพอแล้ว?
RainCast

3
ฉันเพิ่งลงทะเบียนไส้ปากกาและแก้ไขปัญหาของฉัน
Amelia

ดูเหมือนว่ามีสองวิธีในการลงทะเบียนและฉันใช้ผิดวิธีหนึ่ง ... collectionView? .register (UINib (nibName: "YourItemClassName", บันเดิล: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .register (YourItemClassName forCellWithReuseIdentifier: "yourIdentifier")
Sergio


6

ดูเหมือนว่ามีสองวิธีในการลงทะเบียนและฉันใช้ผิดวิธีแรก ฉันมีมุมมอง xib ที่กำหนดเองดังนั้นให้ลงทะเบียนด้วยตัวเลือกที่สองและเรามีข้อมูล!

1:

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

2:

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

0

ฉันมีปัญหาที่คล้ายกัน แต่ความผิดพลาดของฉันคือฉันไม่ได้มอบหมาย CollectionViewCell ให้สามารถเปลี่ยนข้อความป้ายกำกับได้


0

ฉันคิดว่าทางออกที่ดีที่สุดคือการใช้โดยตรงจากสตอรี่บอร์ดที่เพิ่มCollectionView, หรือคุณต้องลบออกCollectionViewCellจากCollectionViewสตอรี่บอร์ดของคุณและลงทะเบียนเซลล์ด้วยคำสั่งต่อไปนี้:

collectionView? .register (UINib (nibName: "YourItemClassName", บันเดิล: ไม่มี), forCellWithReuseIdentifier: "yourIdentifier")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.