Outlets ไม่สามารถเชื่อมต่อกับการทำซ้ำเนื้อหา iOS


144

ฉันเพิ่งสร้างแอพและได้เริ่มเชื่อมต่อ @ IBOutlet เข้ากับกระดานเรื่องราว ฉันกำลังเชื่อมต่อบางส่วนกับป้ายกำกับในเซลล์ต้นแบบ UITableViewCell ด้วยสไตล์พื้นฐาน เมื่อฉันเชื่อมต่อแม้ว่าฉันได้รับข้อผิดพลาดนี้ในกระดานเรื่องราว:

detailText Outlet จาก TableViewController ไปยัง UILabel ไม่ถูกต้อง Outlets ไม่สามารถเชื่อมต่อกับเนื้อหาที่เกิดซ้ำได้

มีคนช่วยฉันได้ไหม ฉันได้ตั้งค่าวิธีที่ฉันทำสำเร็จเสมอ แต่คราวนี้มันโยนความผิดพลาดนี้ให้ฉัน


54
คุณไม่สามารถเชื่อมต่อฉลากในเซลล์ต้นแบบกับ IBOutlet ในคลาสย่อย UIViewController - คุณต้องเชื่อมต่อกับ IBOutlet ในคลาสย่อย UITableviewCell
Paulw11

โอเคขอบคุณ! :) ดังนั้นฉันจึงเข้าใจ: คุณอธิบายได้ไหม
Tomblasta

3
เนื่องจากคุณสามารถมีเซลล์จำนวนเท่าใดก็ได้และมีเพียงคอนโทรลเลอร์มุมมองเดียวดังนั้นป้ายของเซลล์ใดที่ควรเชื่อมต่อกับตัวควบคุมมุมมอง IBOutlet
Paulw11

ตกลงดังนั้นทำไมคุณไม่สามารถใช้ cellForRowAtIndexPath สำหรับข้อความเซลล์ในคอนโทรลเลอร์มุมมองเดียวได้ ขอบคุณ!
Tomblasta

3
เนื่องจากช่องเสียบถูกผูกไว้กับวัตถุ (เช่นป้ายกำกับ) เมื่อโหลดตัวควบคุมมุมมอง - ณ จุดนั้นไม่มีเซลล์ดังนั้นจึงไม่มีป้ายกำกับที่จะผูกและถ้ามีเซลล์ซึ่งคุณต้องการผูกไว้
Paulw11 11

คำตอบ:


168

สร้างคลาสย่อยเซลล์มุมมองตารางและตั้งเป็นคลาสของต้นแบบ เพิ่มสาขาลงในคลาสนั้นและเชื่อมต่อ ตอนนี้เมื่อคุณกำหนดค่าเซลล์คุณสามารถเข้าถึงร้านค้า


9
@ คุณจะช่วยเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับร้านค้าเหล่านั้นได้ไหม?
Juan Boero

1
Juan Pablo - สิ่งที่เขาพูดคือเป็นเรื่องปกติที่จะใช้เซลล์มุมมองตารางแบบกำหนดเอง คุณไม่สามารถตั้งค่าเต้าเสียบสำหรับข้อ จำกัด ภายในมุมมองที่คุณใช้เซลล์แทนคุณต้องทำเช่นนั้นใน cellForRowAtIndexPath ตัวอย่างเช่น - customCell.constraint_row_width.constant = 25.0;
Stuart P.

70

มีเซลล์มุมมองตารางสองประเภทที่จัดเตรียมไว้ให้คุณผ่านกระดานเรื่องราวซึ่งเป็นเซลล์ต้นแบบและเซลล์แบบคงที่

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

1. Dynamic Prototypes

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

เมื่อคุณลากเซลล์ไปยังมุมมองตารางของคุณคุณจะประกาศต้นแบบของเซลล์ จากนั้นคุณสามารถสร้างจำนวนเซลล์ฐานใด ๆ บนต้นแบบนี้และเพิ่มเข้าไปในมุมมองตารางผ่านcellForRowวิธีการทางโปรแกรม ข้อดีของการทำเช่นนี้คือคุณต้องกำหนด 1 ต้นแบบแทนการสร้างแต่ละเซลล์และทุกเซลล์ที่มีการเพิ่มมุมมองทั้งหมดด้วยตัวเอง (ดูเซลล์แบบคงที่)

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

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

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

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

ในที่สุดในcellForRowวิธีการของคุณสร้างเซลล์ที่กำหนดเองจากUITableViewCellชั้นเรียนและทำสิ่งที่สนุกกับฉลาก

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. เซลล์คงที่

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

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

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


@FangmingNing ในรหัสของฉันฉันยังคงไม่สามารถเปลี่ยนป้ายข้อความฉันได้เรียนที่เชื่อมต่อไปยังเซลล์ที่เรียกว่าเซลล์ที่ถูกต้องด้วยตัวระบุ แต่ก็ยังไม่เปลี่ยนแปลง
Jorge Saraiva

@jorgesaraiva มาพูดคุยเรื่องนี้กันในห้องแชทchat.stackoverflow.com/rooms/159396/discuss
Fangming

ฉันหายไป! YourCell +100
Daniel Springer

ดีเสมอที่จะทบทวนเล็ก ๆ น้อย ๆ หลังจากทำงานในโครงการในรหัสเพียง 6 เดือน
ttorbik

ขอบคุณปัญหาของฉันคือฉันกำลังเชื่อมต่อกับ ViewController มากกว่าเซลล์
สเตลล่า

23

หากคุณกำลังใช้มุมมองตารางที่การตั้งค่าการแสดงผลและตัวเลือกอื่น ๆ (เช่นแอปตัวในการตั้งค่าไม่) แล้วคุณสามารถตั้งค่าของตารางที่ดูเนื้อหาที่จะเซลล์แบบคงที่อยู่ภายใต้การแอตทริบิวต์สารวัตร นอกจากนี้เมื่อต้องการทำเช่นนี้คุณต้องฝังมุมมองตารางของคุณในอินสแตนซ์ UITableViewController


นี่เป็นวิธีที่ง่ายกว่าและเร็วกว่าและควรเป็นคำตอบที่ยอมรับได้
Jaime Agudo

5

หรือคุณไม่จำเป็นต้องใช้IBOutletเพื่ออ้างถึงวัตถุในมุมมอง คุณสามารถให้ Label ในtableViewCell a Tag value เช่นตั้ง Tag เป็น123 (ซึ่งสามารถทำได้โดยตัวตรวจสอบคุณสมบัติ) จากนั้นคุณสามารถเข้าถึงป้ายกำกับได้โดย

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

ง่ายมากและเรียบง่าย! +100
Julian Silvestri

1

กับฉันฉันมีUIViewcontrollerและในนั้นฉันมี tableview กับเซลล์ที่กำหนดเองในนั้น ฉันแมปร้านของฉันของ UILabel ลงUItableviewcellไปUIViewControllerแล้วได้รับข้อผิดพลาด


สร้างคลาสเซลล์ที่กำหนดเองและยกตัวอย่าง iboutlet ในคลาสที่คุณกำหนดเองนี้
Shauket Sheikh

0

ในขณะที่คนส่วนใหญ่ได้ชี้ให้เห็นว่าคลาสย่อย UITableViewCellแก้ปัญหานี้ได้ แต่เหตุผลนี้ไม่ได้รับอนุญาตเพราะApple Prototype ( UITableViewCell ) นั้นถูกกำหนดและคุณไม่สามารถเพิ่มช่องทางของคุณเองได้


0

บางครั้ง Xcode ไม่สามารถควบคุมการเชื่อมต่อร้านเซลล์ได้อย่างถูกต้อง

ยังไงก็เถอะฉลาก / ปุ่มของเซลล์ปัจจุบันของฉันเชื่อมต่อกับอีกเซลล์หนึ่งที่ฉันเพิ่งลบออกและข้อผิดพลาดจะหายไป


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