IB_DESIGNABLE, IBInspectable - ตัวสร้างอินเทอร์เฟซไม่อัปเดต


91

ฉันมีชุดรหัสต่อไปนี้:

CustomView.h

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface CustomView : UIView

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

@end

CustomView.m

#import "CustomView.h"

@implementation CustomView

- (void)setBorderColor:(UIColor *)borderColor {
    _borderColor = borderColor;
    self.layer.borderColor = borderColor.CGColor;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    _borderWidth = borderWidth;
    self.layer.borderWidth = borderWidth;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
}

@end

(สำหรับการอ้างอิง Swift ปัญหานี้ก็เกิดขึ้นกับรหัส Swift เช่นกัน)

CustomView.swift

@IBDesignable
class CustomView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    @IBInspectable var borderColor : UIColor = UIColor.clearColor() {
        didSet {
            self.layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius : CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }
}

ฉันเพิ่มไปยังตัวควบคุมมุมมองบนกระดานเรื่องราวและกำหนดประเภทรองในการUIViewCustomView

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

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

เมื่อฉันย้ายไปที่การตรวจสอบแอตทริบิวต์ฉันสามารถตั้งค่าIBInspectableคุณสมบัติเหล่านี้ได้:

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

และเมื่อตั้งค่าแล้วจะปรากฏใน "User Defined Runtime Attributes":

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

อย่างไรก็ตามสถานะ "Designables" จะไม่ก้าวไปไกลกว่า "การอัปเดต" โดยยังคงเป็นคำแนะนำเครื่องมือเดิม (ฉันได้ลองสร้าง Cmd + B หลายครั้งแล้วไม่มีอะไรเปลี่ยนแปลง)

ยิ่งไปกว่านั้นเมื่อฉันตั้งค่าIBInspectableคุณสมบัติฉันได้รับคำเตือนสำหรับแต่ละคุณสมบัติ:

IBDesignables - ละเว้นแอ็ตทริบิวต์รันไทม์ที่ผู้ใช้กำหนดสำหรับพา ธ คีย์ "borderColor" บนอินสแตนซ์ของ "UIView" ... คลาสนี้ไม่สอดคล้องกับการเข้ารหัสคีย์ - ค่าสำหรับ borderColor คีย์

ภาพหน้าจอของคำเตือนที่สร้างขึ้น:

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


ฉันคุ้นเคยกับปัญหาที่สอดคล้องกับการเข้ารหัสคีย์ - ค่าและโดยทั่วไปแล้วจะรู้วิธีแก้ไข ... แต่ฉันไม่เข้าใจวิธีแก้ปัญหานี้ที่นี่ ตามตัวตรวจสอบข้อมูลประจำตัวของข้อมูลพร็อพเพอร์ตี้มุมมองดังกล่าวเป็น "CustomView" (ไม่ใช่ "UIView" ปกติซึ่งไม่มีคุณสมบัติเหล่านี้) และถ้ามุมมองนั้นไม่ใช่ "CustomView" คุณสมบัติที่ออกแบบได้เหล่านี้จะไม่ปรากฏใน Attributes Inspector ใช่ไหม? แต่เมื่อเครื่องมือสร้างอินเทอร์เฟซพยายามใช้แอตทริบิวต์เหล่านี้กับมุมมองมันจะกลับไปคิดว่าคลาสของมุมมองคือ "UIView" และไม่สามารถใช้แอตทริบิวต์ได้

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


จากความคิดเห็นมีการแนะนำว่าอาจไม่มี.mไฟล์รวมอยู่ด้วยและนั่นอาจเป็นสาเหตุของปัญหา ฉันคิดว่าฉันคงออกนอกลู่นอกทางแน่ ๆ เพราะสถานการณ์นี้จะเป็นเช่นนั้น แต่ฉันก็ตรวจสอบอยู่ดี

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

เมื่อฉันเริ่มพยายามทำสิ่งนี้ครั้งแรกฉันเข้าใจว่าIB_DESIGNABLEชั้นเรียนจะต้องเป็นส่วนหนึ่งของUIKitกรอบที่แตกต่างออกไป ดังนั้นจากภาพหน้าจอแรกนี้คุณจะเห็นว่าฉันตั้งค่าเฟรมเวิร์ก "CustomViews" ซึ่งมีคลาสCustomViewเดียว คุณจะเห็นที่นี่ว่าฉันสร้าง a OtherViewซึ่งเหมือนกันCustomViewด้วยยกเว้นไม่ได้อยู่ในกรอบงานแยก อย่างไรก็ตามปัญหาที่เหมือนกันยังคงอยู่บนกระดานเรื่องราวระหว่างทั้งสองคลาส

ที่นี่เรามีภาพหน้าจอที่ระบุว่าCustomView.mรวมอยู่ในCustomViewsกรอบ:

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

ในขณะเดียวกันภาพหน้าจอต่อไปนี้ระบุหลายสิ่ง:

  • CustomViews.framework รวมอยู่ในโครงการหลักอย่างเหมาะสม
  • OtherView.mรวมอยู่ในแหล่งคอมไพล์ด้วยดังนั้นแม้ว่าจะมีบางอย่างผิดปกติCustomViewแต่OtherViewก็ควรใช้งานได้ แต่ก็สร้างข้อผิดพลาดเหมือนกัน
  • Main.storyboardและLaunchScreen.xibแสดงเป็นสีแดง ฉันไม่รู้ว่าทำไมและไม่ได้เบาะแสเล็กน้อยว่าทำไมถึงLaunchScreen.xibควร (ฉันยังไม่ได้แตะไฟล์นี้) แม้ว่าฉันจะพูดได้หลังจากดูโครงการอื่น ๆ แล้วMain.storyboardก็ยังแสดงเป็นสีแดงสำหรับโครงการเหล่านั้นและฉันก็ ไม่ได้ทำอะไรด้วยIB_DESIGNABLEหรือที่IBInspectableนั่น

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


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

คอมพิวเตอร์ทั้งสองเครื่องเป็น Mac Minis ที่ซื้อใหม่ในปีนี้ (ไม่ใช่รุ่นใหม่รุ่นปลายปี 2012) คอมพิวเตอร์ทั้งสองเครื่องใช้ OS X Yosemite 10.10 คอมพิวเตอร์ทั้งสองเครื่องกำลังเรียกใช้ Xcode เวอร์ชัน 6.1 ที่บ้านสร้างคือ (6A1052d) เช้านี้ฉันสามารถยืนยันได้ว่าคอมพิวเตอร์ทั้งสองเครื่องใช้งาน Xcode รุ่นเดียวกัน

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


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


มันเป็นเพียงความคิด ฉันลบ CustomView.m ออกจากเป้าหมายแล้วก็ได้รับคำเตือนที่คล้ายกันเมื่อเรียกใช้แอพ
Martin R

ดูเหมือนว่าเกรมลินจริงเมื่อเปรียบเทียบกับเครื่องจักรที่ดูเหมือนกัน (ซึ่งแตกต่างกันอย่างใด) คุณลองโพสต์ไปที่ devforums หรือยัง? ดูเหมือนว่าคุณกำลังบินตาบอดโดยไม่มีข้อมูลเพิ่มเติมและกระบวนการของคุณดูมีเหตุผลและมีเหตุผล คำเตือน "build" อาจไม่ได้หมายความว่ามากเกินไปเนื่องจาก Xcode เต็มไปด้วยข้อความแสดงข้อผิดพลาดที่ทำให้เข้าใจผิด สำหรับการเตะคุณได้ลอง Editor -> "debug selected view" แล้วใช่ไหม (อาจจะใช้ไม่ได้ แต่ควรตรวจสอบความถูกต้อง) นอกจากนี้ยังมีสิ่งใดปรากฏขึ้นในแอปคอนโซล (การบันทึก) หรือไม่
Chris Conover

กำลังมีปัญหาเดียวกัน ทุ่นระเบิดด้วยไฟล์ xib ไฟล์เดียวที่มี IB_DESIGNABLE อย่างไรก็ตามการตรวจสอบการตั้งค่าของฉันฉันได้เปิดการรีเฟรชอัตโนมัติแล้วและตอนนี้ฉันได้ลองรีเฟรชด้วยตนเองล้างข้อมูลที่ได้รับก่อน ฯลฯ จนถึงขณะนี้ไม่มีอะไรทำงาน สิ่งที่แปลกคือฉันมีการควบคุมนี้ทำงานได้ดีจากนั้นมันก็หยุดลง และฉันไม่คิดว่าฉันจะเปลี่ยนรหัสใด ๆ ในระหว่างนั้น บ้า.
drekka

กำลังแสดงคำเตือนตามด้านบน ตอนนี้ได้สร้างคลาสที่สองโดยมีรหัสที่คัดลอกมาจาก IB ดั้งเดิมที่ออกแบบได้ คลาสนี้ทำงานได้อย่างสมบูรณ์และเมื่อฉันเปลี่ยนกลับไปใช้คลาสเดิมที่ไม่ใช่คลาสทำงานตอนนี้ก็ใช้ได้ดี จากสิ่งนี้ฉันได้ข้อสรุปว่ามีแคชบางส่วน (ไม่ใช่ในข้อมูลที่ได้รับ) ที่ไม่ถูกล้างจนกว่าจะมีการสลับ ib ที่ออกแบบมาสำหรับ ib อื่นที่ออกแบบได้ การเปลี่ยนเป็น UIView ดูเหมือนจะไม่ล้างแคชนี้ เฉพาะ ib อื่นที่ออกแบบได้ Go figure :-)
drekka

คำตอบ:


75

จากคำแนะนำของ chrisco ในการดีบักมุมมองที่เลือก (ซึ่งฉันได้ทำไปแล้ว แต่ไปลองอีกครั้งเพื่อการวัดที่ดี) ฉันสังเกตเห็นตัวเลือกอื่น ๆ อีกสองสามตัวที่ด้านล่างของเมนูตัวแก้ไข

  • รีเฟรชมุมมองโดยอัตโนมัติ
  • รีเฟรชมุมมองทั้งหมด

ฉันคลิก "รีเฟรชมุมมองทั้งหมด" และหลังจาก Xcode คิดได้เล็กน้อยทันใดนั้นกระดานเรื่องราวก็แสดงมุมมองของฉันตามที่คาดไว้ (ใช้IBInspectableคุณสมบัติของฉันอย่างเหมาะสม)

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

จากนั้นฉันก็ทำตามขั้นตอนทั้งหมดอีกครั้งเพื่อยืนยันว่านี่เป็นวิธีแก้ปัญหา

ThirdViewฉันสร้างระดับใหม่ คลาสนี้เหมือนกับคลาสอื่น ๆ อีกครั้ง ฉันเปลี่ยนมุมมองของชั้นเรียนThirdViewและมีบางอย่างที่แตกต่างไปเล็กน้อยในครั้งนี้:

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

คลิก "แสดง" ให้ฉันดูคำเตือน:

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

ใหม่ในครั้งนี้:

การใช้คลาส UIView สำหรับอ็อบเจ็กต์ที่มีคลาสแบบกำหนดเองเนื่องจากคลาส ThirdView ไม่มีอยู่

นี่ไม่ได้มีประโยชน์อะไรมากไปกว่าสิ่งที่มีอยู่แล้ว นอกจากนี้คำเตือนอีกสามรายการยังเพิ่มขึ้นเป็นสองเท่าเป็น 6 ข้อ

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

ถึงจุดนี้ทุกอย่างที่ฉันทำก็เป็นสิ่งที่ฉันไม่เคยยุ่งกับที่บ้าน ที่บ้านก็เพิ่งทำงาน ดังนั้นฉันจึงเปิด "รีเฟรชมุมมองอัตโนมัติ" และสร้าง "มุมมองที่สี่" เพื่อทดสอบอีกครั้งซึ่งเหมือนกับสามรายการแรก

หลังจากเปลี่ยนคลาสของมุมมองเป็น "FourthView" ป้ายกำกับที่ออกแบบได้ระบุว่า "กำลังอัปเดต" ในช่วงเวลาสั้น ๆ ในที่สุดก็พูดว่า "อัปเดต"

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

ฉันจึงตรวจสอบคอมพิวเตอร์ที่บ้าน "รีเฟรชมุมมองอัตโนมัติ" เปิดอยู่ที่คอมพิวเตอร์ที่ทำงานตลอดเวลา มันถูกปิดที่คอมพิวเตอร์ที่ไม่ได้ ฉันจำไม่ได้ว่าแตะตัวเลือกเมนูนี้ ฉันไม่สามารถบอกคุณได้อย่างแน่นอนว่ามีอยู่ก่อน Xcode 6 หรือไม่ แต่ตัวเลือกนี้คือสิ่งที่สร้างความแตกต่าง


TL; DR หากคุณประสบปัญหาเดียวกันกับที่อธิบายไว้ในคำถามตรวจสอบให้แน่ใจว่า "รีเฟรชมุมมองอัตโนมัติ" เปิดอยู่ (หรือ "รีเฟรชมุมมองทั้งหมด" ด้วยตนเองเมื่อคุณต้องการอัปเดตใน IB):

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


2
จริงๆแล้วฉันกำลังมองหาวิธีปิดเนื่องจากมันยังคงแสดงผลในพื้นหลังทำให้ MacBooks รุ่นเก่าทำงานช้ามาก ขอบคุณ!
B

สิ่งนี้อาจแก้ได้ชั่วคราว แต่ลองดูคำตอบจาก @ Martin-Gilles Lavoie
Ashley Mills

22

ฉันมีรายละเอียดเพิ่มเติมเล็กน้อยที่อาจทำให้ไม่สามารถโหลดคลาส IBDesignable ของคุณได้

เลือกสตอรีบอร์ด / xib ที่มีปัญหาของคุณซึ่งควรแสดงมุมมองแบบกำหนดเองของคุณ

ในพื้นที่เนวิเกเตอร์ให้ไปที่ Report Navigator ในพื้นที่ทำงาน / โครงการ XCode ของคุณ

ในเมนู Editor ของ XCode ให้กด (ตามที่กล่าวถึงโดย nhgrif) ตัวเลือก "รีเฟรชมุมมองทั้งหมด" สิ่งนี้จะทำให้ IB เปิดคอมไพล์สำหรับสิ่งต่างๆมากมายที่คุณฉันมั่นใจว่าไม่คาดคิด

ใน Report Navigator คลิกที่ "By Group" เพื่อกรองเนื้อหาและดูที่ส่วน "Interface Builder" คุณจะเห็นว่าเพื่อประโยชน์ในการโหลดกรอบมุมมอง IBDesignable ที่กำหนดเองมันจะรวบรวมสิ่งต่างๆมากมาย หากเป้าหมายใด ๆเหล่านี้ไม่ได้รวบรวมเช่น (อาจเลิกใช้แล้ว) เป้าหมายการทดสอบหน่วย (แม้ว่าจะไม่เกี่ยวข้องกับโค้ดที่โหลดมุมมองหรือสตอรีบอร์ดเหล่านี้โดยสิ้นเชิงก็ตาม) IB จะล้มเหลวในการโหลด dll ของคุณ

ในกรณีของฉัน IB พยายามรวบรวมเป้าหมาย 8 เป้าหมายรวมถึง 4 เป้าหมายที่การทดสอบหน่วยที่ไม่ได้รับการอัปเดตตั้งแต่การเปลี่ยนแปลงการปรับโครงสร้างใหม่ล่าสุดที่เรากำลังดำเนินการ

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


เฮ้ฉันจะหยุด IB ไม่ให้พยายามโหลดและแสดงมุมมองที่ไม่เกี่ยวข้องหรือเชื่อมโยงกับคลาสเหล่านี้ได้อย่างไร
HannahCarney

ฉันสมมติว่ามันเกี่ยวข้องกับการพึ่งพาส่วนหัว เมื่อคลาสที่ออกแบบได้สัมผัสกับคลาสอื่น ๆ ในขณะที่เห็นส่วนหัวก็จะสร้างการใช้งานที่เกี่ยวข้อง Apple กำลังใช้รหัสกราฟการอ้างอิงแหล่งที่มาใน XC7GM ซึ่งล้มเหลวอย่างที่สุดในโครงการของเราด้วย XCode ขัดข้องเมื่อสร้างกราฟ 7.1betas ต่อไปนี้ไม่แสดงปัญหา ระบบสร้างอัตโนมัติของเรายังคงใช้ 6.4 ในขณะนี้ดังนั้นเราจึงไม่ได้ตรวจสอบวิธีแก้ไขเพิ่มเติมภายใต้ XC6.4 เราจะกระโดดตรงไปที่ 7.1GM
Martin-Gilles Lavoie

หากคุณมีเป้าหมาย / โปรเจ็กต์หลายรายการนี่เป็นคำตอบที่ถูกต้องและแก้ไขปัญหาได้อย่างแท้จริง - เป้าหมายทั้งหมดต้องสร้างอย่างสะอาดหมดจดฉันไม่รู้ด้วยซ้ำว่ามีส่วน "ตัวสร้างอินเทอร์เฟซ" ในตัวนำทางรายงาน! คำตอบอื่น ๆ ทั้งหมดที่ฉันเห็นโดยทั่วไปคือการโบกมือจำนวนมากซึ่งอาจแก้ไขได้ชั่วคราว แต่นี่เป็นวิธีแก้ปัญหาขั้นสุดท้าย ทำได้ดี.
Ashley Mills

3
ดังนั้นตามนี้เราสามารถสรุปได้ว่าแอตทริบิวต์ IB_DESIGNABLE เป็นเรื่องที่น่าเบื่อและเสียเวลา เพียงแค่หลีกเลี่ยงการใช้มัน
m8labs

IB_DESIGNABLE ไม่มีส่วนเกี่ยวข้องกับปัญหาและวิธีแก้ไขที่ระบุไว้ข้างต้น เป็นเพียงการตั้งค่าสถานะ NO-OP สำหรับ IB ในการระบุสิ่งที่ใช้งานได้ คุณเพียงแค่ต้องดูแลบ้านให้สะอาด
Martin-Gilles Lavoie

22

คำแนะนำสั้น ๆ สำหรับคนอื่น ๆ ที่มีปัญหานี้อย่าลืมระบุประเภทของตัวแปร

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true

6

ฉันได้รับคำเตือนเหมือนกันIgnoring user defined runtime attribute for key path ..แม้ว่าฉันจะแน่ใจอย่างยิ่งว่าฉันไม่ได้ทำอะไรผิดกับคลาสมุมมอง IBDesignable ที่กำหนดเอง

ปรากฎว่าในกรณีของฉันมันเกี่ยวข้องกับแคช Xcode

rm -rf ~/Library/Developer/Xcode/DerivedData/*

ล้างDerivedDataและคำเตือนก็หายไป


1
ทางลัดใน XCode เพื่อให้ได้ผลลัพธ์เดียวกัน: ⌘⇧K
Mojo66

@ Mojo66 ฉันเชื่อว่า Clean Build แตกต่างจากการล้างโฟลเดอร์ DerivedData แน่นอนว่าบางครั้ง Clean build นั้นดีพอที่จะแก้ปัญหาการแคช Xcode บางอย่างได้
samwize

@ Mojo66 คุณคงหมายถึง⌘⌥⇧K (cmd + alt + shift + K)
tzaloga

5

ในกรณีที่มีข้อผิดพลาดอื่นเกิดขึ้นกับคลาส IB Designables ข้อผิดพลาดไม่มีอยู่ด้วยเหตุผลเดียวกับที่ฉันทำ คำตอบยอดนิยมไม่ใช่ปัญหาของฉัน ... แต่นี่เป็นปัญหาที่เกี่ยวข้องเล็กน้อย ...

มีคุณสมบัติที่ซ่อนอยู่ในซอร์สโค้ดกระดานเรื่องราวที่เรียกว่า customModule

ตัวอย่างเช่นฉันมีคลาสชื่อ ForwardArrow ภายในเฟรมเวิร์กแยกต่างหากที่ฉันเพิ่มไปยังเป้าหมายหลักโดยไม่ได้ตั้งใจ

ดังนั้น XML สำหรับบางมุมมองจึงลงเอยด้วย customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"

เมื่อฉันลบพวกเขาออกจากเป้าหมายหลักในบิลด์บอร์ดเรื่องราวไม่ได้อัปเดต MainTargetNameWasHere เป็น CustomViews ซึ่งเป็นเฟรมเวิร์กที่ตั้งอยู่และเริ่มให้ว่าไม่พบข้อผิดพลาดในคลาส

TLDR ดังนั้น ตรวจสอบให้แน่ใจว่าหาก IBDesignable ของคุณอยู่ในกรอบงานอื่นที่แอตทริบิวต์ customModule xml ในกระดานเรื่องราวของคุณถูกตั้งค่าเป็นค่าที่ถูกต้อง และถ้าไม่มีเลยให้เพิ่ม

ตัวอย่างจากแหล่งที่มาของฉัน:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">

1
อึศักดิ์สิทธิ์นี่ทำให้ฉันรู้สึกแย่มาตลอดหนึ่งวัน ช่างเป็นจุดบกพร่องเล็ก ๆ น้อย ๆ ที่น่ารังเกียจ
GoldenJoe

5

ตามตัวอย่างของฉันฉันใช้CheckboxButtonผ่านพ็อดและกราฟิกของช่องทำเครื่องหมายไม่ปรากฏในกระดานเรื่องราวในขณะที่ฉันได้รับปัญหาเดียวกันที่อธิบายไว้ในคำถามที่นี่:

คำเตือน: IB Designables: การใช้คลาส UIView สำหรับอ็อบเจ็กต์ที่มีคลาสแบบกำหนดเองเนื่องจากคลาส CheckboxButton ไม่มีอยู่

และ

คำเตือน: IB Designables: ละเว้นแอตทริบิวต์รันไทม์ที่ผู้ใช้กำหนดสำหรับพา ธ คีย์ "checkColor" บนอินสแตนซ์ของ "UIView" ตีข้อยกเว้นเมื่อพยายามตั้งค่า: [setValue: forUndefinedKey:]: คลาสนี้ไม่สอดคล้องกับการเข้ารหัสคีย์ค่าสำหรับคีย์ checkColor

วิธีแก้ปัญหาของฉันคือจัดหาโมดูลที่มีชื่อCheckboxButtonดังต่อไปนี้:

หมายเหตุ: คุณควรแทนที่CheckboxButtonเป็นชื่อโมดูลที่คุณใช้


4

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


ฉันทำตามที่คุณพูดและมันช่วยแก้ปัญหาของฉันได้ โซลูชันก่อนหน้าทั้งหมดที่เปิดเผยที่นี่ไม่ได้ทำ ขอบคุณมาก. ; o)
XLE_22

@ XLE_22 บางครั้งก็เป็นคำตอบที่ไม่มีใครมองว่าแก้ได้ใช่ไหม :)
HannahCarney

ฉันมีปัญหาที่ฉันเปลี่ยนชื่อคุณสมบัติ IBInspectable บน xib บางส่วนของฉัน หลังจากทำเช่นนั้นฉันมีคำเตือนมากมายที่แจ้งให้ฉันทราบว่า XCode ไม่พบคุณสมบัติที่เปลี่ยนชื่อในขณะนี้ การนำคุณสมบัติออกจากตัวตรวจสอบข้อมูลประจำตัวช่วยแก้ปัญหาของฉัน
WBuck

1

ฉันรู้ว่านี่คือคำตอบ แต่นี่เป็นอีกหนึ่งประสบการณ์

ฉันประสบปัญหาบางอย่างที่ไม่เกี่ยวข้องกับปัญหานี้ แต่ในกระบวนการนี้ฉันได้ลบ @IBInspectable ออกจาก vars ในคลาสของฉันและลบแอตทริบิวต์จากตัวตรวจสอบข้อมูลประจำตัว (alt-apple-3)

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

ในที่สุดผมสังเกตเห็นว่าพวกเขากลับมาแต่ในคุณลักษณะสารวัตร (Alt-แอปเปิ้ล-4) ทันทีที่ฉันเพิ่มค่าให้กับพวกเขาที่นั่นพวกเขาก็ปรากฏตัวอีกครั้งในตัวตรวจสอบข้อมูลประจำตัว


1

คำตอบของ Dave Thomasข้างต้นให้วิธีแก้ปัญหา (ย้อนกลับ) แก่ฉันเมื่อไม่ใช่ของคนอื่น (ข้อมูลที่ได้มา, ตัวแก้ไข> รีเฟรช) ทำ แต่เพื่อความชัดเจนในกรณีที่คนไม่แน่ใจว่าจะแก้ไข XML ได้ที่ไหน ... คุณไม่ต้องทำ ไม่จำเป็นต้อง!

  1. ในไฟล์สตอรี่บอร์ดของคุณให้เลือกมุมมองที่มีปัญหา
  2. บนแถบด้านข้างขวามือเลือกแท็บ Identity Inspector (ตัวเลือกที่ 3 จากทางซ้าย)
  3. คุณจะมีคลาสที่กำหนดเองซึ่งควรตั้งค่าไว้แล้วและModule. สำหรับฉันมันว่างเปล่าและฉันได้รับข้อผิดพลาดเดียวกันกับ OP ฉันตั้งเป็นชื่อโปรเจ็กต์Moduleของฉันและ BAM - มันเริ่มทำงานหลังจากสร้างใหม่!

0

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

ด้วยเหตุผลใดก็ตามการลบรหัสนี้ออกจาก IBDesignable ของฉันแก้ไขได้:

-(void)viewDidLoad {
    self.clipsToBounds = YES;
}

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


3
คุณพลาดการโทรหาอาหารมื้อเย็นที่นี่
RolandasR

0

ฉันประสบปัญหาเดียวกันและฉันต้องเปลี่ยน cornerRadius และ BorderWidth เป็น String แล้วส่งไปที่ CGFloat มันเป็นทางออกเดียวที่ฉันจะสามารถเปลี่ยนค่าและดูการเปลี่ยนแปลงในตัวสร้างอินเทอร์เฟซได้

@IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor!.CGColor
    }
}

@IBInspectable var borderWidth: String? {
    didSet {
        layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0)
    }
}

@IBInspectable var cornerRadius: String? {
    didSet {
        layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0)
        layer.masksToBounds = layer.cornerRadius > 0
    }
}

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