IBOutlet เป็นศูนย์ แต่เชื่อมต่อกับสตอรี่บอร์ด Swift


102

ใช้ Swift 1.1 และ Xcode 6.2

ฉันมี UIStoryboard ที่มีUIViewControllerคลาสย่อยที่เป็นเอกพจน์แบบกำหนดเอง ในนั้นฉันมีการ@IBOutletเชื่อมต่อประเภทUIViewจากคอนโทรลเลอร์นั้นไปยังUIView คลาสย่อยบนกระดานเรื่องราว ฉันยังมีร้านค้าที่คล้ายกันสำหรับมุมมองย่อยของมุมมองนั้น ดูรูปก.

แต่ในขณะรันคุณสมบัติเหล่านี้เป็นศูนย์ (รูปที่ B) แม้ว่าฉันจะมั่นใจได้ว่าฉันได้เชื่อมต่อร้านค้าใน Interface Builder แล้ว

ความคิด :

  • เป็นไปได้ไหมว่าเนื่องจากฉันใช้คลาสย่อยของคลาสย่อยบางอย่างทำให้การเริ่มต้นทำงานผิดปกติ ฉันไม่ได้ลบล้างตัวเริ่มต้นใด ๆ
  • awakeFromNib: ไม่ได้รับการเรียกด้วยเหตุผลบางประการ
  • บางทีอาจไม่ได้เชื่อมต่อกับมุมมองย่อยในมุมมองย่อย

สิ่งที่ฉันได้ลอง:

  • @IBOutletประเภทรายการที่ตรงกันและสตอรี่บอร์ด (แทนที่จะเป็นUIView)
  • การลบคุณสมบัติและเต้ารับและเพิ่มเข้าไปใหม่

รูปที่ก

รูป A *

รูป B

รูป B

* รหัสที่ถูกปิดบังFigure Aคือ:

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!

ขอบคุณ.


ทำไมไม่เปลี่ยน! ถึง ?

clearView เป็นศูนย์เนื่องจากไม่ได้เชื่อมโยงกับสตอรีบอร์ด (ดูวงกลมทางด้านซ้ายของโค้ดที่มีรูซึ่งแสดงว่าไม่ได้เชื่อมโยง) ในภาพหน้าจอฉันไม่เห็นการประกาศคำอธิบายประกอบ
Javier Flores Font

@JavierFloresFont: clearViewฉันคาดว่าจะไม่มี มันเป็นสิ่งที่ฉันยังไม่ได้ refactor ดูเชิงอรรถสำหรับรูป A. @ShaanSingh มันควรจะเป็น! เนื่องจากการเชื่อมต่อจากสตอรีบอร์ด (ควรจะ) ตั้งค่าไว้ที่รันไทม์และไม่ควรเป็นศูนย์
Stefan Arambasich

ตัวควบคุมมุมมองนี้โหลดได้อย่างไร แสดงรหัสที่ถามหาหรืออธิบายการทำต่อที่เชื่อมต่อกับรหัสนั้น
rob mayoff

1
กำลังได้รับสตอรี่บอร์ดที่ถูกต้อง: let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController
Stefan Arambasich

คำตอบ:


146

โดยทั่วไปสิ่งนี้เกิดขึ้นเนื่องจากตัวควบคุมมุมมองของคุณยังไม่ได้โหลดลำดับชั้นมุมมอง ตัวควบคุมมุมมองจะโหลดเฉพาะลำดับชั้นของมุมมองเมื่อมีบางสิ่งส่งviewข้อความมา ระบบจะดำเนินการดังกล่าวเมื่อถึงเวลาที่ต้องวางลำดับชั้นของมุมมองบนหน้าจอซึ่งจะเกิดขึ้นหลังจากสิ่งต่างๆเช่นprepareForSegue:sender:และviewWillAppear:ได้กลับมา

เนื่องจาก VC ของคุณยังไม่ได้โหลดลำดับชั้นการดูร้านค้าของคุณจึงยังคงเป็นศูนย์

คุณสามารถบังคับ VC _ = self.viewโหลดลำดับชั้นมุมมองของตนโดยกล่าวว่า


4
สิ่งนี้เกิดขึ้นเมื่อviewWillAppear:ถูกเรียกเป็นครั้งแรกที่ฉันทำอะไรกับเต้าเสียบนั้น การเข้าถึงมุมมองไม่ได้ทำอะไรให้ฉัน ยังคงเป็นศูนย์
Stefan Arambasich

ขอบคุณ! สิ่งนี้ได้ผลสำหรับฉันเช่นกัน var v = viewcontroller.view; บังคับให้โหลดลำดับชั้นการดู เคล็ดลับเล็ก ๆ น้อย ๆ ที่ดี! ;)
Yordi Uytersprot

@YordiUytersprot คุณจะวางสายนี้ไว้ที่ไหน?
Async-

4
ถ้าคุณสร้างอินสแตนซ์ viewcontroller: ให้ vc = self.storyboard? .instantianteViewControllerWithIdentifier ("StoryboardIDfromVC") เป็น? CustomVC; ให้ดู = vc.view; // ตอนนี้คุณสามารถเข้าถึง IBOutlets จาก CustomVC ได้ที่นี่ .. vc.customTextField.text = "Lalala"; หวังว่ามันจะช่วยคุณได้! :)
Yordi Uytersprot

4
UIViewcontroller.loadViewIfNeeded()เป็นวิธีที่เหมาะสมที่จะใช้ที่นี่
orkoden

27

คุณลองเรียกใช้ Product> Clean หรือยัง แก้ปัญหาที่คล้ายกันมากสำหรับฉัน


ฉันทำ. ขออภัยหมายถึงการทำเครื่องหมายคำตอบของฉัน มันเริ่มทำงานหลังจากที่ฉันลบDerivedDataโฟลเดอร์สำหรับโปรเจ็กต์เท่านั้น
Stefan Arambasich

3
ร้านค้าของฉันเพียงสองแห่งที่อยู่ตรงกลางของลำดับชั้นมุมมองของฉันก็ไม่มี .. สินค้า -> Clean ใช้ได้ผลกับฉัน!
Rikco

1
obj c แค่ทำความสะอาดโครงการก็ใช้ได้แล้ว ... ไม่น่าเชื่อว่าใช้เวลาเกินหนึ่งชั่วโมงและไม่คิดจะทำความสะอาดโครงการ: / แต่ขอบคุณครับ !!
เรือนกระจก

Just Product -> Clean ไม่ได้ผลสำหรับฉัน แต่ฉันเริ่มโปรแกรมจำลองอื่นและใช้งานได้ดังนั้นจะต้องมีบางอย่างผิดปกติในโฟลเดอร์ DerivedData ด้วย
endavid

22

คุณสร้างอินสแตนซ์ตัวควบคุมมุมมองจาก Storyboard หรือ NIB หรือไม่หรือคุณสร้างอินสแตนซ์โดยตรงผ่านทาง initializer

หากคุณสร้างอินสแตนซ์คลาสของคุณโดยตรงด้วยตัวเริ่มต้นร้านค้าจะไม่เชื่อมต่อ ตัวสร้างอินเทอร์เฟซจะสร้างอินสแตนซ์ที่กำหนดเองสำหรับคลาสของคุณและเข้ารหัสอินสแตนซ์เหล่านั้นลงใน NIB และสตอรี่บอร์ดสำหรับการถอดรหัสซ้ำมันไม่ได้กำหนดคลาสเอง หากนี่เป็นปัญหาของคุณคุณเพียงแค่ต้องเปลี่ยนรหัสที่คุณสร้างคอนโทรลเลอร์เพื่อใช้วิธีการบน UIStoryboard หรือ UINib แทน


2
ฉันกำลังสร้างUIStoryboardอินสแตนซ์และเรียกinstantiateViewControllerWithIdentifierใช้
Stefan Arambasich

16

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


2
นี่คือคำตอบ ฉันต่อสู้กับสิ่งนี้มาระยะหนึ่งแล้วทำความสะอาดโฟลเดอร์ build และทุกอย่าง ในกรณีของฉันviewDidLoad()มีการเชื่อมต่อทั้งหมด แต่ในviewWillAppear()เกือบทั้งหมดnilมีการเชื่อมต่อ (บางครั้งยังคงเชื่อมต่อหนึ่งหรือสองรายการ) ฉันลองทุกอย่างและในที่สุดก็ลบโฟลเดอร์ข้อมูลที่ได้มาสร้างใหม่และทุกอย่างก็เรียบร้อยดี
ruttopia

6
แม้ว่าจะผ่านไป 3 ปีแล้ว Xcode 9.2 ก็ยังคงมีบั๊กของพระเจ้าเหมือนเดิม ขอบคุณมาก.
Kemal Can Kaynak

1
ที่นี่เพื่อรายงานว่าสิ่งนี้ยังคงมีอยู่ใน Xcode 11 :(
เวลาเมื่อ

13

สิ่งนี้เกิดขึ้นกับฉันด้วยเซลล์มุมมองคอลเลกชันที่กำหนดเองของฉัน ปรากฎว่าฉันต้องแทนที่เมธอด registerClassforReuseIdentifier ด้วย registerNib ที่แก้ไขให้ฉัน


คุณพูดถูก ฉันอ่านเนื้อหาการนับ ARC ใน Swift Programming Language โดยละเอียด ฉันไม่สามารถหาเหตุผลได้ว่าทำไมคุณสมบัติที่อ่อนแอของ IBOutlet จึงยังคงเป็นศูนย์ ในที่สุดฉันก็ Google สำหรับ '@IBOutlet swift nil' และค้นหาคำตอบของคุณใน SO จากนั้นฉันทำเครื่องหมายเทมเพลต Xcode ของบรรทัดที่เพิ่ม 'self.collectionView! .registerClass' ใน viewDidLoad จากนั้นก็ใช้งานได้ คุณช่วยชีวิตฉัน
charles.cc.hsu

12

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


หากคุณใช้ไฟล์ XIB การสร้างอินสแตนซ์โดยตรงยังคงทำงานได้สำเร็จ
Luat Vu Dinh

11

ในกรณีของฉันมันเกิดขึ้นเนื่องจากฉันเขียนทับloadViewเมธอดในคลาสย่อย ViewController ของฉัน แต่ลืมเพิ่ม[super loadView]

-(void)loadView {
// blank
}

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

หากคุณใช้ loadView ในคลาสย่อย view controller ของคุณคุณจะต้องรับผิดชอบในการโหลดองค์ประกอบ UI จาก storyboard / xib เป็นโค้ด

หรือโทร

[super loadView];

เพื่อให้ซูเปอร์คลาสมีโอกาสโหลดสตอรี่บอร์ด / xib เป็นโค้ด


8

คุณสามารถเรียกcontroller.viewเพื่อบังคับให้โหลดมุมมองเพื่อเริ่มต้น IBOutlets จากนั้นคุณจะสามารถกำหนดค่าได้

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "identifier") {
        let controller = segue.destinationViewController as! YourController
        let _ = controller.view //force to load the view to initialize the IBOutlets

        controller.your_IBOutlet_property = xxx
        ...
        controller.delegate = self
    }
}

7

หากคุณสร้างอินสแตนซ์view controllerผ่านทางโปรแกรม จากนั้นลองสร้างตามด้านล่าง

let initialVC = self.storyboard?.instantiateViewController(withIdentifier: "InitialVC") as! InitialVC

แทนโดยตรง

let initialVC = InitialVC()

สิ่งนี้ได้ผลสำหรับฉัน


6

สำหรับฉันสิ่งนี้เกิดขึ้นเมื่อฉันบังเอิญประกาศคลาสของตัวควบคุมมุมมองของฉันเป็น

class XYZViewController: UINavigationController {
}

(กล่าวคือUINavigationControllerไม่ใช่ a UIViewController)

Xcode ไม่ได้รับกับความผิดพลาดนี้ชั้นที่ดูเหมือนว่าจะสร้างดีและฟังก์ชั่นการแทนที่เช่นviewDidLoad, viewWillAppearฯลฯ ทำงานได้อย่างถูกต้อง แต่ไม่มีการIBOutletเชื่อมต่อใด ๆ

การเปลี่ยนการประกาศเป็น

class XYZViewController: UIViewController {
}

แก้ไขให้เรียบร้อย


5

ฉันพบปัญหานี้เมื่อเร็ว ๆ นี้! นี่คือความคิดของฉัน ปัญหาไม่ได้เกี่ยวกับสตอรีบอร์ดของคุณหรือปัญหาลิงก์ใด ๆ เป็นเรื่องเกี่ยวกับวิธีที่คุณเริ่มต้น ViewController ของคุณ โดยเฉพาะอย่างยิ่งเมื่อคุณใช้ Swift (แทบจะไม่มีอะไรในตัวแก้ไขเมื่อคุณสร้างไฟล์คลาส)

เพียงแค่ใช้init()จากคลาส super ไม่สามารถเริ่มต้นสิ่งที่คุณทำงานกับกระดานเรื่องราว ดังนั้นสิ่งที่คุณต้องทำคือเปลี่ยนการเริ่มต้นของ ViewController แทนที่ let XXViewController = XXViewController() ด้วย let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController สิ่งนี้จะบอกให้โปรแกรมไปที่กระดานเรื่องราวค้นหา XXViewController และเริ่มต้นทั้งหมดIBOutletในกระดานเรื่องราวของคุณ

หวังว่านี่จะช่วยได้ ~ GL


นั่นไม่ใช่ปัญหา
Stefan Arambasich

4

ปี 2019 ความเป็นไปได้อย่างหนึ่งสำหรับปัญหาที่น่ากลัวนี้:

  • สมมติว่าคุณมีมุมมองคอนเทนเนอร์ที่แสดงนาฬิกาบางประเภท คุณมี

    นาฬิกาคลาส: UIViewController

จริงๆคุณใช้มันในหลายสถานที่ในการตรวจสอบ

บนหน้าจอหลักบนหน้าจอรายละเอียดบนหน้าจอแก้ไข

คุณมีแอพที่ทันสมัยเหมือน snapchat ที่ซับซ้อน

ในความเป็นจริงClockอาจเป็นจริงที่เต็มไปมากกว่าหนึ่งครั้งในเวลาเดียวกันที่ไหนสักแห่งบนหน้าจอเดียวกัน (อาจจะซ่อนอยู่ในบางกรณี)

คุณเริ่มทำงานในหนึ่งอินสแตนซ์Clockบนหนึ่งในสตอรีบอร์ดจำนวนมากของคุณ

บนกระดานเรื่องราวคุณเพิ่มป้ายกำกับ NewLabel

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

คุณได้เชื่อมต่อแน่นอน

แต่แอปขัดข้องด้วยNewLabelเป็นศูนย์

Xcode บอกคุณอย่างชัดเจนว่า "คุณลืมเชื่อมต่อเต้าเสียบ"

เหตุผลก็คือ .......... คุณมี "NewLabel" บนกระดานเรื่องราวเพียงอันเดียวที่ใช้ Clock!

ความผิดพลาดเกิดจาก>>> ที่อื่น <<<<คุณใช้นาฬิกา !!!!

Xcode ไม่ได้บอกคุณว่าความผิดพลาดนั้นมาจากที่อื่นโดยสิ้นเชิงไม่ใช่จากที่ที่คุณกำลังทำงาน!

ความผิดพลาดไม่ได้มาจากสถานที่ที่คุณทำงานอยู่ แต่มาจากสตอรีบอร์ดอื่นซึ่งไม่มีรายการ "NewLabel" บนกระดานเรื่องราวนั้น !!!

น่าผิดหวัง



2

คุณต้องโหลดลำดับชั้นของมุมมองก่อนเพื่อสร้างอินสแตนซ์ของร้านค้าในสตอรีบอร์ด สำหรับสิ่งนี้คุณสามารถเรียกใช้เมธอด loadView หรือ loadViewIfNeeded ด้วยตนเอง


2

ในกรณีของฉันแอปเริ่มหยุดทำงานในทันที การแก้ไขจุดบกพร่องเผยให้เห็นว่าร้านค้าทั้งหมดยังคงnilอยู่ในเวลาviewDidLoad()นั้น

แอปของฉันยังคงใช้ปลายปากกา (ไม่ใช่สตอรีบอร์ด) สำหรับตัวควบคุมมุมมองส่วนใหญ่ ทุกอย่างอยู่ในสถานที่ร้านค้าทั้งหมดต่อสายอย่างถูกต้อง ฉันตรวจสอบอีกครั้ง

โดยทั่วไปเราจะสร้างอินสแตนซ์ตัวควบคุมมุมมองของเราเป็นไฟล์

let newVC = MYCustomViewController()

... ซึ่งด้วยเหตุผลบางอย่างดูเหมือนว่าจะใช้งานได้ตราบเท่าที่. xib ถูกตั้งชื่อเหมือนกับคลาสตัวควบคุมมุมมอง (ไม่แน่ใจว่าทำงานอย่างไรเราไม่ได้เรียกinit(nibName:bundle:)ด้วยอาร์กิวเมนต์ศูนย์หรือลบล้างinit()เพื่อทำselfเช่นนั้น โดยทั่วไปจะแนะนำ ... )

ผมจึงพยายามโทรอย่างชัดเจน

 let newVC = MYCustomViewController(nibName: "MYCustomViewController", bundle: .main)

... เท่านั้นที่จะได้รับการต้อนรับด้วยข้อผิดพลาดข้อยกเว้นรันไทม์:

*** การยุติแอปเนื่องจากข้อยกเว้นที่ไม่ถูกจับ 'NSInternalInconsistencyException' เหตุผล: 'ไม่สามารถโหลด NIB ในชุดรวม:' NSBundle </ Users / nicolasmiari / Library / Developer / CoreSimulator / Devices / 3DA3CF21-108D-498F-9649-C4FC9E3C1A8D / data /Containers/Bundle/Application/C543DDC1-AE86-4D29-988C-9CCE89E23543/MyApp.app> (โหลด) 'ด้วยชื่อ' MYCustomViewController ''

และจากนั้นผมเห็นมัน

ไม่ได้เลือกช่องทำเครื่องหมาย "Target Membership" ของไฟล์. xib


ต้องเกิดขึ้นเมื่อแก้ไขข้อขัดแย้งในการผสานที่พบบ่อยเกี่ยวกับไฟล์โครงการ Xcode

แน่นอนว่า Apple ต้องมีรูปแบบไฟล์โครงการที่เป็นมิตรกับ SCM มากกว่า


2

โซลูชันการทำงาน 100% สำหรับการสร้าง ViewControllers จาก XIB โดยไม่มี StoryBoards

  1. สร้างคลาส CustomViewController: UIViewController
  2. สร้างมุมมอง CustomViewControllerView.xib
  3. ใน CustomViewControllerView.xib ใน Interface Builder ให้เลือก Placeholders -> File's Owner
  4. ใน "Attributes inspector" ตั้งค่า Class เป็น CustomViewController
  5. ใน "ตัวตรวจสอบการเชื่อมต่อ" เชื่อมต่อ "มุมมอง" กับมุมมองระดับบนสุดของ xib (ตรวจสอบให้แน่ใจว่าคลาสของมุมมองระดับบนสุดไม่ได้ชี้ไปที่ CustomViewController)
  6. ใน "Connections inspector" ให้เชื่อมต่อร้านอื่น ๆ (ถ้าจำเป็น / มีอยู่)
  7. สร้างอินสแตนซ์ของ CustomViewController ในพาเรนต์วิวคอนโทรลเลอร์ / ผู้แทนแอพ

7.1.

// creating instance
let controller = CustomViewController()

7.2.

// connecting view/xib with controller instance
let bundle = Bundle(for: type(of: controller))
bundle.loadNibNamed("CustomViewControllerView", owner: controller, options: nil)

7.3.

// get/set outlets
controller.labelOutlet.text = "title"
controller.imageOutlet.image = UIImage(named: "image1")

คำตอบที่ยอดเยี่ยมขอบคุณ! สำหรับสิ่งที่คุ้มค่าคุณยังสามารถแทนที่init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)และเรียกขั้นตอนที่ 7.2 selfได้โดยตรงในคลาส CustomViewController
brandonscript

1

ตรวจสอบการเชื่อมต่อ IBOutlet ของคุณว่าเชื่อมต่อกับเจ้าของไฟล์หรือมุมมอง อาจมีข้อผิดพลาด


1

กรณีอื่น ๆ :

ร้านค้าของคุณจะไม่ได้รับการตั้งค่าจนกว่ามุมมองของตัวควบคุมมุมมองจะถูกสร้างอินสแตนซ์จริงซึ่งในกรณีของคุณอาจเกิดขึ้นไม่นานหลังจาก initWithNibName: bundle: - ณ จุดใดที่พวกเขาจะยังคงเป็นศูนย์ การตั้งค่าใด ๆ ที่คุณทำซึ่งเกี่ยวข้องกับร้านค้าเหล่านั้นควรเกิดขึ้นในเมธอด -viewDidLoad ของคอนโทรลเลอร์มุมมองของคุณ


1

สำหรับฉันฉันมีข้อผิดพลาดเดียวกันบนกระดานเรื่องราวที่แปลเป็นภาษาท้องถิ่นมีการเพิ่มองค์ประกอบในบางภาษาและไม่ได้อยู่ในที่อื่นดังนั้นฉันจึงมีการอ้างอิงที่เป็นโมฆะสำหรับองค์ประกอบนั้นเมื่อเปลี่ยนไปใช้ตำแหน่งองค์ประกอบที่ขาดหายไปฉันต้องลบการแปล (ซ้ำซ้อน) สำหรับ ที่ใช้กระดานhttps://stackoverflow.com/a/42256341/1356559


1

สำหรับฉันนี่เป็นปัญหาเพราะcontainerViewเป็นศูนย์

นี่คือรหัสของฉันกับความผิดพลาด

@IBOutlet private var containerView: UIView!  // Connected to Storyboard
override open func loadView() {
    containerView.addSubview(anotherView)
}

สิ่งที่ขาดหายไปคือโทรsuper.loadView(). ดังนั้นการเพิ่มมันช่วยแก้ปัญหาให้ฉันได้

รหัสคงที่ :

@IBOutlet private var containerView: UIView!
override open func loadView() {
    super.loadView()
    containerView.addSubview(anotherView)
}

คุณไม่ควรโทรหา loadView () โดยตรง ( developer.apple.com/documentation/uikit/uiviewcontroller/… ) เรียก self.view แทน
Lio

1

ฉันมีปัญหาคล้ายกันเมื่อก่อนหน้านี้ฉันได้เพิ่ม register (_: forCellReuseIdentifier :) สำหรับเซลล์ที่กำหนดเองหลังจากที่ฉันได้กำหนดตัวระบุในสตอรี่บอร์ดแล้ว มีรหัสนี้ในฟังก์ชัน viewDidLoad () เมื่อฉันลบออกมันก็ใช้งานได้ดี


1

อีกกรณีหนึ่งที่ฉันเพิ่งเจอ ฉันเปลี่ยนชื่อคลาสสำหรับ UIViewController แต่ลืมเปลี่ยนชื่อไฟล์. xib ที่สร้างอินเทอร์เฟซ

พอจับได้และตั้งชื่อไฟล์ให้ตรงกับชื่อคลาสมันก็ดีมาก!

ฉันหวังว่าจะช่วยใครบางคน


1

มีอีกหนึ่ง ...

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


1

คุณสามารถตรวจสอบได้ว่ามีการโหลดมุมมองหรือไม่

if isViewLoaded && view.window != nil {
 //self.annotationOptionsView.
}

0
  1. เลือกทั้งสอง.hและ.mดูไฟล์คอนโทรลเลอร์
  2. ลบการอ้างอิงของไฟล์เหล่านั้น
  3. เพิ่มไฟล์อีกครั้งในโครงสร้างโครงการของคุณ
  4. เปิดกระดานเรื่องราวและสร้างโครงการใหม่ในที่สุด

0

บังเอิญผม subclassed ควบคุมมุมมองของฉันกับแทนAVPlayerViewController UIViewControllerโดยการเล่นซ้ำเป็นUIViewControllerสิ่งที่กลับมาปกติ สิ่งนี้น่าจะช่วยได้

ไม่มีการทำความสะอาดบิวด์ (ปกติและเต็ม) การลบโฟลเดอร์ข้อมูลที่ได้มาและการออกจาก Xcode นั้นใช้ได้ผลกับฉัน


0

ฉันมีปัญหาเดียวกันหลังจากคัดลอกคลาส (เชื่อมโยงกับ xib) เพื่อใช้ซ้ำกับคลาสวิวคอนโทรลเลอร์อื่น (เชื่อมโยงกับสตอรีบอร์ด) ฉันลืมเอาออก

override var nibName

และ

override var nibBundle

วิธีการ

หลังจากถอดออกแล้วร้านค้าของฉันก็เริ่มทำงาน


0

เห็นใช้ViewControllerมั้ย!? ในViewControllerระดับที่คุณต้องใช้-viewDidLoad, ไม่ได้ -awakeFromNib , -awakeFromNibใช้สำหรับการUIViewระดับ



0

หากคุณมีสองตัวmain.storyboardsและคุณกำลังทำการเปลี่ยนแปลงผิดพลาดสิ่งนี้อาจเกิดขึ้นได้ สิ่งนี้สามารถเกิดขึ้นได้ทุกเมื่อที่คุณเชื่อมต่อเต้าเสียบจากสิ่งที่storyboardไม่ได้กำหนด

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