ข้อผิดพลาด: CUICatalog: ระบุชื่อเนื้อหาไม่ถูกต้อง: (null) หรือตัวคูณมาตราส่วนไม่ถูกต้อง: 2.000000


120
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000

เพิ่มภาพหน้าจอแล้ว

รับคำเตือนนี้ขณะทำงานกับ TableViewController วิธีแก้ไขข้อผิดพลาดนี้และบล็อกใดได้รับผลกระทบ


คุณสามารถโพสต์รหัสได้หรือไม่?
Patrick Hofman

2
คำเตือนนี้จะปรากฏขึ้นหากชื่อภาพเป็นสตริงว่าง
onmyway133

คำตอบ:


242

หนึ่งนี้จะปรากฏขึ้นเมื่อมีคนพยายามที่จะใส่nilใน[UIImage imageNamed:]

เพิ่มเบรกพอยต์เชิงสัญลักษณ์สำหรับ [UIImage imageNamed:]ตัวอย่างจุดพักเชิงสัญลักษณ์

เพิ่ม$arg3 == nilเงื่อนไขใน Simulator $r0 == nilเงื่อนไขบน iPhone 32 บิตหรือ$x2 == nilบน iPhone 64 บิต

เรียกใช้แอปพลิเคชันของคุณและดูว่าตัวแก้ไขจุดบกพร่องจะหยุดที่ใด

ปล. โปรดทราบว่าสิ่งนี้จะเกิดขึ้นหากชื่อภาพเป็นสตริงว่างเปล่า คุณสามารถตรวจสอบได้โดยเพิ่ม[(NSString*)$x2 length] == 0เงื่อนไข


7
นี่เป็นแนวทางที่ชาญฉลาด ดูเหมือนว่าภาพศูนย์ของฉันจะอยู่ที่ไหนสักแห่งในปลายปากกาของฉันมันจึงไม่ผ่านไปUIImage imageNamed:แต่ฉันกำลังบันทึกจุดพักนี้ไว้
cbowns

9
ฉันไม่รู้เกี่ยวกับ$arg3ไวยากรณ์สำหรับเบรกพอยต์แบบมีเงื่อนไข ฉันจะเรียนรู้เพิ่มเติมได้ที่ไหน?
Zev Eisenberg

3
error: use of undeclared identifier '$arg3'ไม่แน่ใจว่าจะเข้าใจว่าทำไมมันไม่ทำงานสำหรับฉันเสมอกลับมา ฉันพลาดอะไรไปหรือเปล่า?
เบ็น

5
ฉันได้รับ: หยุดเนื่องจากข้อผิดพลาดในการประเมินเงื่อนไขของเบรกพอยต์ 23.1: "$ r0 == nil" ไม่สามารถแยกวิเคราะห์นิพจน์ตามเงื่อนไข: ข้อผิดพลาด: การใช้ตัวระบุที่ไม่ได้ประกาศข้อผิดพลาด '$ r0': 1 ข้อผิดพลาดในการแยกวิเคราะห์นิพจน์
Pranoy C

8
ในกรณีของฉันสตริงชื่อรูปภาพว่างเปล่าดังนั้นการตรวจสอบความยาว arg3 จึงใช้ได้กับฉัน (int)[$arg3 length] == 0
Matthew Korporaal

62

ข้อผิดพลาดนี้ (โดยปกติ) เกิดขึ้นเมื่อคุณพยายามโหลดรูปภาพด้วย[UIImage imageNamed:myImage]แต่ iOS ไม่แน่ใจว่าmyImageเป็นจริงNSStringหรือไม่แล้วคุณมีคำเตือนนี้

คุณสามารถแก้ไขได้โดยใช้:

[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]

หรือคุณสามารถตรวจสอบlengthชื่อของUIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
ในกรณีที่มีใครทำผิดแบบเดียวกับที่ฉันทำฉันพยายามอัปเดตภาพพื้นหลังของ UIButton ที่จะลบออก (ไม่มีภาพเลย) ฉันจึงเปลี่ยนชื่อ UIImage จากสตริงเป็นเพียง "" ซึ่งทำให้เกิดข้อผิดพลาด เมื่อลบ UIImage ทั้งหมด (ชื่อ: "") และแทนที่ด้วยศูนย์ข้อผิดพลาดจะหายไป
Dave G

@DaveG คุณชายช่วยฉันได้หลายชั่วโมง ขอบคุณสำหรับความคิดเห็น!
Jeff

22

เนื่องจากข้อผิดพลาดจะบ่นว่าชื่อที่คุณให้เป็นนี้น่าจะเกิดจากการโทร(null) หรือมากขึ้นโดยเฉพาะการส่งผ่านในตัวแปรยังไม่ได้รับการตั้งค่าดังนั้นจึงเท่ากับ[UIImage imageNamed:nil] nilในขณะที่ใช้stringWithFormat:จะกำจัดข้อผิดพลาดฉันคิดว่ามีโอกาสดีที่ไม่ได้ทำตามที่คุณต้องการจริงๆ หากชื่อที่คุณให้เป็นnilค่าแล้วใช้ stringWithFormat: จะส่งผลให้มันมองหาภาพที่มีชื่ออักษร "(null)" [UIImage imageNamed:@"(null)"]ราวกับว่าคุณกำลังเรียกร้อง

สิ่งนี้น่าจะเป็นตัวเลือกที่ดีกว่า:

if (name) {
    UIImage *image = [UIImage imageNamed:name];
} else {
    // Do something else
}

คุณอาจต้องการตั้งค่าเบรกพอยต์ใน Xcode บนบรรทัด "ทำอย่างอื่น" เพื่อช่วยให้คุณทราบว่าเหตุใดโค้ดนี้จึงถูกเรียกด้วยค่าศูนย์ตั้งแต่แรก


1
ฉันพบปัญหาเดียวกันและข้อผิดพลาดคือชื่อภาพไม่มีค่าเหมือนที่ robotspacer พูด
diegomen

17

ใน Xcode 6.4 ดูเหมือนว่าจะเกิดขึ้นเมื่อใช้ "รูปภาพที่เลือก" สำหรับรายการแถบแท็บในกระดานเรื่องราวแม้ว่าจะเป็นภาพที่ถูกต้องก็ตาม

ใส่คำอธิบายภาพที่นี่

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

ใส่คำอธิบายภาพที่นี่


1
ขอบคุณสำหรับสิ่งนั้น! ข้อความแสดงข้อผิดพลาด / คำเตือนเหล่านี้ทำให้ฉันรู้สึกแย่! ฉันคิดไม่ออกว่าทำไม Apple ถึงไม่กำจัดรายการแถบแท็บ "ภาพที่เลือก" แบบเลื่อนลงใน IB หรือแก้ไขเพื่อให้ทำงานได้อย่างถูกต้อง
wcochran

4

ในกรณีของฉันฉันส่ง [UIImage imageNamed: @ ""] ซึ่งทำให้ฉันต้องแสดงคำเตือน เพียงเพิ่มเบรกพอยต์ในทุกบรรทัดที่คุณใช้ imageNamed และดีบักบรรทัดที่คุณพบคำเตือน


ฉันยังใช้[UIImage imageNamed:@""]. คุณแก้ไขมันอย่างไร?
Julfikar

[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann

นอกเหนือจากการใช้ifเพื่อทดสอบว่าชื่อรูปภาพไม่ใช่สตริงว่างเปล่าหรือใช้อิมเมจ "noImage" เริ่มต้นคุณจะแสดงภาพอย่างไรเมื่อไม่มีชื่อที่เกี่ยวข้องและ Assets ไม่มีรูปภาพ "noImage"
หายไป

2

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

หลังจากการตรวจสอบของสตอรี่บอร์ด XML ที่ฉันพบว่าการอ้างอิงภาพซึ่งก่อนหน้านี้ได้ชี้ไปที่ "BottomBar" imageView:fFo-1g-jzs:imageในสินทรัพย์แคตตาล็อกแทนชี้ไปที่

ในตอนท้ายของไฟล์ XML ภายใต้<resources>แท็กชื่อแท็ก<image name="imageView:fFo-1g-jzs:image">ที่มีmutableDataหยดขนาดใหญ่

หลังจากรีเซ็ตการอ้างอิงรูปภาพในสตอรีบอร์ดและลบหยดแล้วข้อผิดพลาดก็หายไป


สิ่งนี้แก้ไขได้สำหรับฉันมองหาปัญหานี้มาระยะหนึ่งแล้วมันทำให้ฉันรู้สึกแย่ Schtick เบรกพอยต์ไม่ทำงานสำหรับฉัน
Moshe Gottlieb

ปัญหาเดียวกันที่นี่ แต่เบรกพอยต์ช่วยฉันค้นหา xib ที่อยู่ในชื่อภาพคือ Unknown Image ใน IB
Josh Bernfeld

1

ฉันเพิ่งแก้ไขข้อผิดพลาดนี้ เพียงตรวจสอบการใช้งาน[UIImage imageNamed:(NSString*) imageName]ฟังก์ชั่น หากimageNameเป็นnilเช่นนั้นข้อผิดพลาดจะเกิดขึ้น


1

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

if (iconImageName && [iconImageName length])
{

    [UIImage imageNamed:iconImageName];
}
else
{
     iconImageName.hidden = YES;
}

หวังว่าจะช่วยได้ !!!!


0

สาเหตุของข้อผิดพลาดกำลังส่งค่าศูนย์ไปยังเมธอด "imageNamed:" เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถซ่อน imageView ของคุณได้เมื่อคุณพยายามที่จะส่งผ่านค่าศูนย์ โอกาสอาจเกิดขึ้นในการนำ imageViews มาใช้ซ้ำใน UITableView หรืออาจอยู่ใน scrollViews

ฉันหลีกเลี่ยงคำเตือนด้วยการตรวจสอบด้านล่าง:

UIImageView *your_image_view;
NSString *imageName;
if(imageName && imageName.length){
 your_image_view.hidden = NO;
 your_image_view.image = [UIImage imageNamed:imageName];
}
else {
 your_image_view.hidden = YES;
}

0

ฉันได้รับคำเตือนนี้เมื่อฉันโหลดการใช้รูปภาพ[[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]มากกว่าฉันเปลี่ยนเป็น[UIImage imageNamed:normalStr]คำเตือนก็หายไป


0

วิธีการหนึ่งคือทำวิธีการคลาส swizzling เพื่อแทนที่[UIImage imageNamed:]ด้วยการนำไปใช้ของคุณเองจากนั้นตรวจสอบชื่อภาพในการนำไปใช้งานของคุณ ดูสิ่งต่อไปนี้:

จะสลับเมธอดคลาสบน iOS ได้อย่างไร

ฉันใช้สิ่งนี้ในหมวด UIImage (Debug) ของฉัน:

+ (UIImage *)db_imageNamed:(NSString *)imageName {
    if ([imageName length] == 0) {
        NSLog(@"breakpoint here");
    }
    return [self db_imageNamed:imageName];  // not a recursive call here after swizzling
}

คุณอาจต้องการที่จะหมุนวน[UIImage imageNamed:inBundle:compatibleWithTraitCollection:]เช่นกัน


-1

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

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.