ยืนยันความล้มเหลวใน dequeueReusableCellWithIdentifier: forIndexPath:


324

ดังนั้นฉันจึงสร้างโปรแกรมอ่าน RSS สำหรับโรงเรียนของฉันและทำโค้ดให้เสร็จ ฉันทำการทดสอบและมันทำให้ฉันมีข้อผิดพลาด นี่คือรหัสที่อ้างถึง:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                     forIndexPath:indexPath];
    if (cell == nil) {

        cell = 
         [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  
                                reuseIdentifier:CellIdentifier];

    }

นี่คือข้อผิดพลาดในผลลัพธ์:

2012-10-04 20: 13: 05.356 ผู้อ่าน [4390: c07] * การยืนยันล้มเหลวใน - [UITableView dequeueReuseCellWithIdentifier: forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableViewView.m4444 2012-04-04 20: 13: 05.356 ผู้อ่าน [4390: c07] * การยืนยันล้มเหลวใน - 13: 05.357 ผู้อ่าน [4390: c07] *แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSInternalInconsistencyException' เหตุผล: 'ไม่สามารถ dequeue เซลล์ด้วยตัวระบุเซลล์ - ต้องลงทะเบียนไส้ปากกาหรือคลาสสำหรับตัวระบุหรือเชื่อมต่อเซลล์ต้นแบบในกระดานเรื่องราว ' * สแต็คโยนสายแรก (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935 ) libc ++ abi.dylib: ยุติที่เรียกว่าการขว้างข้อยกเว้น

และนี่คือรหัสที่แสดงในหน้าจอข้อผิดพลาด:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

กรุณาช่วย!


คำตอบ:


488

คุณกำลังใช้dequeueReusableCellWithIdentifier:forIndexPath:วิธีการ เอกสารสำหรับวิธีการที่บอกว่านี้:

สำคัญ:คุณต้องลงทะเบียนคลาสหรือไฟล์ปลายปากกาโดยใช้registerNib:forCellReuseIdentifier:หรือregisterClass:forCellReuseIdentifier:วิธีการก่อนที่จะเรียกวิธีนี้

"Cell"คุณไม่ได้ลงทะเบียนจะงอยหรือระดับสำหรับการระบุที่นำมาใช้ใหม่

เมื่อมองไปที่โค้ดของคุณดูเหมือนว่าคุณจะคาดหวังว่าวิธีการรับสัญญาณจะส่งคืนnilหากไม่มีเซลล์ให้ คุณต้องใช้dequeueReusableCellWithIdentifier:สำหรับพฤติกรรมนั้น:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

สังเกตว่าdequeueReusableCellWithIdentifier:และdequeueReusableCellWithIdentifier:forIndexPath:มีวิธีการต่างกัน ดูเอกสารสำหรับอดีตและหลัง

หากคุณต้องการที่จะเข้าใจว่าทำไมคุณต้องการที่จะใช้ที่เคยdequeueReusableCellWithIdentifier:forIndexPath:, ตรวจสอบ Q & A นี้


166
พระเจ้าช่วย. ทำไมเท็มเพลตเริ่มต้นของ Xcode สำหรับ UITableViewController ให้ dequeueReusableCellWithIdentifier โดยอัตโนมัติ: forIndexPath:? ไม่ช่วยเหลือดังนั้น
spstanley

15
dequeueReusableCellWithIdentifer:forIndexPath:(แนะนำใน iOS6) คือการปรับปรุงที่ดีเนื่องจากคุณไม่จำเป็นต้องตรวจสอบว่ามือถือเป็นศูนย์ ( UITableViewControllerทำงานคล้ายกับUICollectionView) แต่ใช่น่ารำคาญที่การเปลี่ยนแปลงนี้ไม่ได้แสดงความคิดเห็นในเทมเพลตและข้อความยืนยัน / ความล้มเหลวไม่เป็นประโยชน์มากกว่า
Jason Moore

2
อย่างน้อยที่สุดคุณคิดว่าจะเป็นค่าเริ่มต้นเป็น UITableViewCell แทนที่จะเป็นการขยาย Baka
BadPirate

13
บรรทัดสุดท้ายของคำตอบนี้เป็นสีทอง: ผมถูกกัดมากกว่าหนึ่งครั้งโดยใช้เมื่อฉันควรจะได้รับการใช้dequeueReusableCellWithIdentifier:forIndexPath: dequeueReusableCellWithIdentifier:
ele

คำตอบนี้สมบูรณ์แบบ ฉันมีคำถาม: ฉันมี tableViewController เป็นตัวควบคุมมุมมองเริ่มต้นของฉัน ที่ didSelectRow ... ฉันกำลังดัน tableViewController อีกอันลงบนสแต็กการนำทาง ทำไมฉันต้องลงทะเบียนเซลล์สำหรับ tableViewController ตัวที่สองไม่ใช่ตัวแรก?
ArielSD

137

ฉันคิดว่าข้อผิดพลาดนี้เกี่ยวกับการลงทะเบียนปลายปากกาหรือคลาสของคุณสำหรับตัวระบุ

เพื่อให้คุณสามารถทำสิ่งที่คุณทำใน tableView ของคุณ: ฟังก์ชัน cellForRowAtIndexPath และเพิ่มรหัสด้านล่างใน viewDidLoad ของคุณ:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

มันใช้งานได้สำหรับฉัน หวังว่ามันจะช่วยได้


3
gotcha ขนาดเล็กหนึ่งอันด้วยสิ่งนี้ - ตรวจสอบให้แน่ใจว่าตัวระบุการใช้ซ้ำนั้นตรงกับสิ่งที่คุณได้ตั้งค่าไว้ในการตั้งค่าสตอรี่บอร์ดสำหรับเซลล์ที่มีปัญหา
James Boutcher

เพื่อเพิ่มในกรณีการใช้งานที่แตกต่างกันเล็กน้อยฉันได้ทำการเลือกแถวในมุมมองหลักของ SplitViewController อีกครั้ง ตรรกะแถวที่เลือกใหม่นี้อยู่ในviewDidLoadและย้ายตรรกะนี้เพื่อviewDidAppearแก้ไข
Craig Conover

มันไม่สามารถเข้าไปในเซลล์ == ศูนย์ดังนั้นเซลล์ tableview ของฉันจะไม่มีค่า
Solid Soft

3
swift 3.0: self.tableView.register (UITableViewCell.classForCoder (), forCellReuseIdentifier: "เซลล์");
norbDEV

68

แม้ว่าคำถามนี้ค่อนข้างเก่า แต่มีความเป็นไปได้อีกอย่างหนึ่ง: หากคุณใช้สตอรีบอร์ดคุณต้องตั้งค่า CellIdentifier ในสตอรีบอร์ด

ดังนั้นหาก CellIdentifier ของคุณเป็น "เซลล์" เพียงแค่ตั้งค่าคุณสมบัติ "ตัวระบุ": ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบให้แน่ใจในการทำความสะอาดงานสร้างของคุณหลังจากทำเช่นนั้น บางครั้ง XCode มีปัญหาบางอย่างกับการอัปเดตสตอรีบอร์ด


3
คุณเจ๋งมากการทำความสะอาดก็เยอะมาก !! : D
Sandy

2
หมายเหตุ - หากคุณใช้ตัวระบุอื่นที่ไม่ใช่ "เซลล์" คุณจะต้องเปลี่ยนวิธีการ cellForRowAtIndexPath เพื่อใช้ตัวระบุนี้ในบรรทัดต่อไปนี้: static NSString * CellIdentifier = @ "MyCellIdentifier";
gamozzii

5
สิ่งสำคัญที่นอกเหนือจากนี้: มุมมองตารางจะต้องมีแอตทริบิวต์ "เนื้อหา" ที่ตั้งค่าเป็น "แบบไดนามิกต้นแบบ" ไม่ใช่ "เซลล์แบบคงที่"
Ted Avery

คำตอบนี้ต้องสูงขึ้น มีประโยชน์มาก
Sukitha Udugamasooriya

การสร้างการทำความสะอาดเป็นสิ่งจำเป็นหลังจากอัพเดตIdentifierคุณสมบัติ ขอบคุณ!
Crashalot

59

ฉันมีปัญหาเดียวกันแทนที่ด้วย

static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell==nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    }

แก้ไข


ขอบคุณ. เพียงแค่ช่วยฉันปวดหัว =)
Robert

3
เคล็ดลับ: ถ้าคุณใช้- (id) dequeueReusableCellWithIdentifier: forIndexPath:ไม่จำเป็นต้องตรวจสอบว่าเซลล์เป็นศูนย์หรือไม่ (IOS6>)
seufagner

เพิ่งช่วยฉันปวดหัว =)
Abo3atef

26

ปัญหาคือมีแนวโน้มมากที่สุดเพราะคุณเอง config UITableViewCellในกระดาน แต่คุณไม่ได้ใช้อินสแตนซ์สตอรี่บอร์ดของคุณซึ่งใช้นี้UITableViewController UITableViewCellตัวอย่างเช่นใน MainStoryboard คุณมีUITableViewControllerคลาสย่อยที่เรียกว่าMyTableViewControllerและมีไดนามิกที่กำหนดเองที่UITableViewCellเรียกว่าMyTableViewCellมีรหัสประจำตัว "MyCell"

หากคุณสร้างที่กำหนดเองของคุณUITableViewControllerเช่นนี้:

 MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];

มันจะไม่ลงทะเบียน tableviewcell ที่คุณกำหนดเองโดยอัตโนมัติสำหรับคุณ คุณต้องลงทะเบียนด้วยตนเอง

แต่ถ้าคุณใช้กระดานเรื่องราวเพื่อยกตัวอย่างMyTableViewControllerเช่นนี้:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard  instantiateViewControllerWithIdentifier:@"MyTableViewController"];

สิ่งที่ดีเกิดขึ้น! UITableViewControllerจะลงทะเบียนเซลล์ tableview ที่กำหนดเองโดยอัตโนมัติที่คุณกำหนดไว้ในกระดานเรื่องราวให้คุณ

ในวิธีมอบสิทธิ์ของคุณ "cellForRowAtIndexPath" คุณสามารถสร้างเซลล์มุมมองตารางของคุณดังนี้:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

//Configure your cell here ...

return cell;
}

dequeueReusableCellWithIdentifier จะสร้างเซลล์ใหม่ให้คุณโดยอัตโนมัติหากไม่มีเซลล์ที่นำมาใช้ซ้ำได้ในคิวการรีไซเคิล

จากนั้นคุณก็ทำ!


เคล็ดลับที่ใช้instantiateViewControllerWithIdentifierเพื่อเริ่มต้น viewController ของฉันบันทึกวันของฉัน!
Lei Zhang

บันทึกวันของฉัน: เซลล์ต้นแบบอยู่ใน VC ใกล้เคียงพร้อมโต๊ะ
Anton Tropashko

นี่คือสาเหตุที่สมเหตุสมผลในกรณีของฉัน
โนรา Alnashwan

19

ฉันจะเพิ่มที่Xcode 4.5รวมใหม่dequeueReusableCellWithIdentifier:forIndexPath:
ในรหัสแม่แบบเริ่มต้น - gotcha ที่เป็นไปได้สำหรับนักพัฒนาคาดหวังว่าdequeueReusableCellWithIdentifier:วิธีการที่ เก่ากว่า


ต่อยฉัน! ตอนนี้ฉันจะรู้ดีกว่า ;)
spstanley

18

ในกระดานเรื่องราวของคุณคุณควรตั้งค่า 'ตัวระบุ' ของเซลล์ต้นแบบของคุณให้เหมือนกับ CellReuseIdentifier "เซลล์" ของคุณ จากนั้นคุณจะไม่ได้รับข้อความนั้นหรือจำเป็นต้องเรียกใช้ฟังก์ชัน registerClass:


2
Gotcha! ปุ่ม '100 upvotes' อยู่ที่ไหน นี่คือทางออกที่แท้จริง
Jojo.Lechelt

คุณคิดว่าการเพิ่ม tableView ใหม่ลงในสตอรี่บอร์ดจะเป็นตัวระบุค่าเริ่มต้น - 'Cell' สำหรับคุณ มันถูกมองข้ามอย่างง่ายดายโดยเฉพาะถ้าคุณใช้ 'รหัสฟรี' ใน tableView: cellForRowAtIndexPath!
ushika

18

โซลูชัน Swift 2.0:

คุณต้องเข้าไปที่ตัวตรวจสอบคุณสมบัติของคุณและเพิ่มชื่อสำหรับตัวระบุเซลล์ของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นคุณต้องทำให้ตัวระบุของคุณตรงกับ dequeue เช่นนี้:

let cell2 = tableView.dequeueReusableCellWithIdentifier("ButtonCell", forIndexPath: indexPath) as! ButtonCell

อีกทางเลือกหนึ่ง

หากคุณทำงานกับปลายปากกาคุณอาจต้องลงทะเบียนชั้นเรียนของคุณใน cellForRowAtIndexPath ของคุณ:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {       

    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwitchCell")

    // included for context            
    let cell = tableView.dequeueReusableCellWithIdentifier("SwitchCell", forIndexPath:indexPath) as! SwitchCell

    //... continue    
}

การอ้างอิงคลาส UITableView ของแอปเปิ้ลบอกว่า:

ก่อนทำการ dequeueing เซลล์ใด ๆ ให้เรียกใช้เมธอดนี้หรือเมธอด registerNib: forCellReuseIdentifier: เพื่อบอกมุมมองตารางเกี่ยวกับวิธีสร้างเซลล์ใหม่ หากเซลล์ประเภทที่ระบุไม่ได้อยู่ในคิวที่นำมาใช้ใหม่ในปัจจุบันมุมมองตารางจะใช้ข้อมูลที่ให้ไว้เพื่อสร้างวัตถุเซลล์ใหม่โดยอัตโนมัติ

หากก่อนหน้านี้คุณลงทะเบียนคลาสหรือไฟล์ nib ด้วยตัวระบุการใช้ซ้ำเดียวกันคลาสที่คุณระบุในพารามิเตอร์ cellClass จะแทนที่รายการเก่า คุณสามารถระบุ nil สำหรับ cellClass หากคุณต้องการยกเลิกการลงทะเบียนคลาสจากตัวระบุการใช้ซ้ำที่ระบุ

นี่คือรหัสจากกรอบแอปเปิ้ล Swift 2.0:

// Beginning in iOS 6, clients can register a nib or class for each cell.
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
// Instances returned from the new dequeue method will also be properly sized when they are returned.

@available(iOS 5.0, *)
func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)

@available(iOS 6.0, *)
func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)

ฉันไม่เข้าใจว่าSwitchCell.selfมาจากไหน
Gert Cuykens

@GertCuykens SwitchCell เป็น UITableViewCell ที่กำหนดเองของฉัน
Dan Beaulieu

1
ตอนนี้ฉันไม่ได้ใช้ Mac แต่ตอนนี้ฉันสามารถกลับบ้านได้แน่นอน
Dan Beaulieu

1
แทนที่ด้วยUITableViewCell.selfดูเหมือนจะทำงานให้ฉัน อาจเพิ่มบันทึกย่อในคำตอบ
Gert Cuykens

@GertCuykens ขอบคุณที่ชี้ให้เห็นว่าฉันได้เปลี่ยน SwitchCell.self สำหรับ UITableViewCell.self
Dan Beaulieu

3

หากคุณจะไปกับCustom Static Cellsเพียงแค่แสดงความคิดเห็นวิธีการนี้:

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    static NSString *CellIdentifier = @"notificationCell";
//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
//    return cell;
//}

และระบุเซลล์ที่"แอตทริบิวต์ตัวตรวจสอบ"ในกระดานเรื่องราว


3

ฉันให้คำตอบทั้งใน Objective C และ Swift ก่อนหน้านี้ฉันอยากจะพูด

หากเราใช้งานdequeueReusableCellWithIdentifier:forIndexPath:เราจะต้องลงทะเบียนคลาสหรือไฟล์ปลายปากกาโดยใช้ registerNib: forCellReuseIdentifier: หรือ registerClass: forCellReuseIdentifier: วิธีก่อนที่จะเรียกวิธีนี้เป็น Apple Documnetation กล่าวว่า

ดังนั้นเราจึงเพิ่ม registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier:

เมื่อเราลงทะเบียนคลาสสำหรับตัวระบุที่ระบุและต้องสร้างเซลล์ใหม่วิธีนี้จะเริ่มต้นเซลล์โดยการเรียก initWithStyle: reuseIdentifier: method สำหรับเซลล์ที่ใช้ปลายปากกาวิธีนี้จะโหลดวัตถุเซลล์จากไฟล์ปลายปากกาที่จัดเตรียมไว้ หากเซลล์ที่มีอยู่พร้อมใช้งานสำหรับการใช้ซ้ำวิธีนี้จะเรียกเมธอด prepareForReuse ของเซลล์แทน

ในวิธี viewDidLoad เราควรลงทะเบียนเซลล์

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

ตัวเลือกที่ 1:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

ตัวเลือก 2:

[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"cell"];

ในรหัสข้างต้นnibWithNibName:@"CustomCell"ให้ชื่อปลายปากกาของคุณแทนชื่อปลายปากกา CustomCell ของฉัน

SWIFT

ตัวเลือกที่ 1:

tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

ตัวเลือก 2:

tableView.registerNib(UINib(nibName: "NameInput", bundle: nil), forCellReuseIdentifier: "Cell") 

ในรหัสข้างต้นnibName:"NameInput"ให้ชื่อปลายปากกาของคุณ


3

การทำงานกับ Swift 3.0:

override func viewDidLoad() {
super.viewDidLoad()

self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell

return cell
}

2

ฉันใช้เวลาหลายชั่วโมงในคืนที่ทำงานเพราะเหตุใดตารางที่สร้างโดยทางโปรแกรมของฉันจึงขัดข้องบน [myTable setDataSource: self]; มันก็โอเคที่จะแสดงความคิดเห็นและ popping ตารางว่างเปล่า แต่ล้มเหลวทุกครั้งที่ฉันพยายามเข้าถึงแหล่งข้อมูล

ฉันมีการตั้งค่าตัวแทนในไฟล์ h: @interface myViewController: UIViewController

ฉันมีซอร์สโค้ดข้อมูลในการใช้งานและยังคงบูม! เกิดข้อผิดพลาดทุกครั้ง! ขอบคุณที่ "xxd" (หมายเลข 9): การเพิ่มบรรทัดของรหัสนั้นแก้ไขให้ฉัน! ในความเป็นจริงฉันเปิดตัวตารางจากปุ่ม IBAction ดังนั้นนี่คือรหัสเต็มของฉัน:

    - (IBAction)tapButton:(id)sender {

    UIViewController* popoverContent = [[UIViewController alloc]init];

    UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
    popoverView.backgroundColor = [UIColor greenColor];
    popoverContent.view = popoverView;

    //Add the table
    UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)         style:UITableViewStylePlain];

   // NEXT THE LINE THAT SAVED MY SANITY Without it the program built OK, but crashed when      tapping the button!

    [table registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    table.delegate=self;
    [table setDataSource:self];
    [popoverView addSubview:table];
    popoverContent.contentSizeForViewInPopover =
    CGSizeMake(200, 300);

    //create a popover controller
    popoverController3 = [[UIPopoverController alloc]
                          initWithContentViewController:popoverContent];
    CGRect popRect = CGRectMake(self.tapButton.frame.origin.x,
                                self.tapButton.frame.origin.y,
                                self.tapButton.frame.size.width,
                                self.tapButton.frame.size.height);


    [popoverController3 presentPopoverFromRect:popRect inView:self.view   permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];



   }


   #Table view data source in same m file

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
    NSLog(@"Sections in table");
    // Return the number of sections.
    return 1;
   }

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
  {
    NSLog(@"Rows in table");

    // Return the number of rows in the section.
    return myArray.count;
   }

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath    *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *myValue;

    //This is just some test array I created:
    myValue=[myArray objectAtIndex:indexPath.row];

    cell.textLabel.text=myValue;
    UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 12.0 ];
    cell.textLabel.font  = myFont;

    return cell;
   }

โดยวิธีการ: ปุ่มจะต้องเชื่อมโยงกับ IBAction และเป็น IBOutlet หากคุณต้องการยึดป๊อปโอเวอร์กับมัน

UIPopoverController * popoverController3 ถูกประกาศในไฟล์ H โดยตรงหลังจาก @interface ระหว่าง {}


2

FWIW ฉันได้รับข้อผิดพลาดเดียวกันนี้เมื่อฉันลืมตั้งค่าตัวระบุเซลล์ในกระดานเรื่องราว หากนี่คือปัญหาของคุณในกระดานเรื่องราวให้คลิกเซลล์มุมมองตารางและตั้งค่าตัวระบุเซลล์ในตัวแก้ไขแอตทริบิวต์ ตรวจสอบให้แน่ใจว่าตัวระบุเซลล์ที่คุณตั้งไว้ที่นี่เหมือนกับ

static NSString *CellIdentifier = @"YourCellIdenifier";

2

ฉันมีปัญหาเดียวกันมีข้อผิดพลาดเดียวกันและสำหรับฉันมันทำงานเช่นนี้:

[self.tableView registerNib:[UINib nibWithNibName:CELL_NIB_HERE bundle: nil] forCellReuseIdentifier:CELL_IDENTIFIER_HERE];

อาจจะเป็นประโยชน์สำหรับคนอื่น


2

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

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

แก้ไขข้อผิดพลาด แต่ฉันยังคงสูญเสีย ฉันไม่ได้ใช้ 'เซลล์ที่กำหนดเอง' เพียงแค่ดูด้วยการฝัง tableview ฉันได้ประกาศตัวควบคุม viewage เป็นผู้รับมอบสิทธิ์และแหล่งข้อมูลและทำให้แน่ใจว่าตัวระบุเซลล์ตรงกันในไฟล์ เกิดอะไรขึ้นที่นี่?


1

นี่อาจดูโง่สำหรับบางคน แต่มันทำให้ฉัน ฉันได้รับข้อผิดพลาดนี้และปัญหาสำหรับฉันคือฉันพยายามใช้สแตติกเซลล์ แต่จากนั้นเพิ่มเนื้อหาแบบไดนามิกมากขึ้น หากคุณกำลังเรียกวิธีนี้ว่าเซลล์ของคุณจำเป็นต้องเป็นต้นแบบแบบไดนามิก เลือกเซลล์ในสตอรีบอร์ดและภายใต้ตัวตรวจสอบคุณสมบัติสิ่งแรกที่บอกว่า 'เนื้อหา' และคุณควรเลือกต้นแบบแบบไดนามิกที่ไม่คงที่


ขอบคุณ! นี่เป็นปัญหาของฉันอย่างแน่นอน
อิสยาห์เทอร์เนอร์

1

เป็นเพียงส่วนเสริมของคำตอบ: อาจมีเวลาที่คุณตั้งค่าทุกอย่างถูกต้อง แต่คุณอาจเพิ่ม UIs อื่น ๆ ในตัวคุณโดยบังเอิญ.xibเช่นUIButton: ป้อนคำอธิบายรูปภาพที่นี่ เพียงแค่ลบ UI พิเศษมันใช้งานได้


1

ตรวจสอบให้แน่ใจว่าตัวระบุ CellIdentifier == ของเซลล์ในกระดานเรื่องราวทั้งสองชื่อเหมือนกัน หวังว่านี่จะใช้งานได้สำหรับคุณ


0

ในกรณีของฉันความผิดพลาดเกิดขึ้นเมื่อฉันโทรdeselectRowAtIndexPath:

บรรทัดคือ [tableView deselectRowAtIndexPath:indexPath animated:YES];

เปลี่ยนเป็น[self.tableView deselectRowAtIndexPath:indexPath animated:YES]; แก้ไขปัญหาของฉัน!

หวังว่านี่จะช่วยทุกคน


0

ใน Swift ปัญหานี้สามารถแก้ไขได้โดยการเพิ่มรหัสต่อไปนี้ในของคุณ

viewDidLoad

วิธี.

tableView.registerClass(UITableViewCell.classForKeyedArchiver(), forCellReuseIdentifier: "your_reuse_identifier")

-1

พบข้อผิดพลาด bc ตัวระบุการใช้ซ้ำของเซลล์นั้นผิด - ความผิดพลาดมือใหม่ แต่เกิดขึ้น: 1. ทำให้ตัวระบุการใช้เซลล์ที่ใช้ซ้ำของ SURE ไม่มีการสะกดผิดหรือตัวอักษรที่หายไป 2. ในบรรทัดเดียวกันอย่าลืมการนับตัวพิมพ์ใหญ่ 3. เลขศูนย์ไม่ใช่ "O" s (Ohs)

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