TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
รับคำเตือนนี้ขณะทำงานกับ TableViewController วิธีแก้ไขข้อผิดพลาดนี้และบล็อกใดได้รับผลกระทบ
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
รับคำเตือนนี้ขณะทำงานกับ TableViewController วิธีแก้ไขข้อผิดพลาดนี้และบล็อกใดได้รับผลกระทบ
คำตอบ:
หนึ่งนี้จะปรากฏขึ้นเมื่อมีคนพยายามที่จะใส่nilใน[UIImage imageNamed:]
เพิ่มเบรกพอยต์เชิงสัญลักษณ์สำหรับ [UIImage imageNamed:]
เพิ่ม$arg3 == nilเงื่อนไขใน Simulator $r0 == nilเงื่อนไขบน iPhone 32 บิตหรือ$x2 == nilบน iPhone 64 บิต
เรียกใช้แอปพลิเคชันของคุณและดูว่าตัวแก้ไขจุดบกพร่องจะหยุดที่ใด
ปล. โปรดทราบว่าสิ่งนี้จะเกิดขึ้นหากชื่อภาพเป็นสตริงว่างเปล่า คุณสามารถตรวจสอบได้โดยเพิ่ม[(NSString*)$x2 length] == 0เงื่อนไข
UIImage imageNamed:แต่ฉันกำลังบันทึกจุดพักนี้ไว้
$arg3ไวยากรณ์สำหรับเบรกพอยต์แบบมีเงื่อนไข ฉันจะเรียนรู้เพิ่มเติมได้ที่ไหน?
error: use of undeclared identifier '$arg3'ไม่แน่ใจว่าจะเข้าใจว่าทำไมมันไม่ทำงานสำหรับฉันเสมอกลับมา ฉันพลาดอะไรไปหรือเปล่า?
(int)[$arg3 length] == 0
ข้อผิดพลาดนี้ (โดยปกติ) เกิดขึ้นเมื่อคุณพยายามโหลดรูปภาพด้วย[UIImage imageNamed:myImage]แต่ iOS ไม่แน่ใจว่าmyImageเป็นจริงNSStringหรือไม่แล้วคุณมีคำเตือนนี้
คุณสามารถแก้ไขได้โดยใช้:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
หรือคุณสามารถตรวจสอบlengthชื่อของUIImage:
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
เนื่องจากข้อผิดพลาดจะบ่นว่าชื่อที่คุณให้เป็นนี้น่าจะเกิดจากการโทร(null) หรือมากขึ้นโดยเฉพาะการส่งผ่านในตัวแปรยังไม่ได้รับการตั้งค่าดังนั้นจึงเท่ากับ[UIImage imageNamed:nil] nilในขณะที่ใช้stringWithFormat:จะกำจัดข้อผิดพลาดฉันคิดว่ามีโอกาสดีที่ไม่ได้ทำตามที่คุณต้องการจริงๆ หากชื่อที่คุณให้เป็นnilค่าแล้วใช้ stringWithFormat: จะส่งผลให้มันมองหาภาพที่มีชื่ออักษร "(null)" [UIImage imageNamed:@"(null)"]ราวกับว่าคุณกำลังเรียกร้อง
สิ่งนี้น่าจะเป็นตัวเลือกที่ดีกว่า:
if (name) {
UIImage *image = [UIImage imageNamed:name];
} else {
// Do something else
}
คุณอาจต้องการตั้งค่าเบรกพอยต์ใน Xcode บนบรรทัด "ทำอย่างอื่น" เพื่อช่วยให้คุณทราบว่าเหตุใดโค้ดนี้จึงถูกเรียกด้วยค่าศูนย์ตั้งแต่แรก
ใน Xcode 6.4 ดูเหมือนว่าจะเกิดขึ้นเมื่อใช้ "รูปภาพที่เลือก" สำหรับรายการแถบแท็บในกระดานเรื่องราวแม้ว่าจะเป็นภาพที่ถูกต้องก็ตาม
ดูเหมือนจะไม่ได้ตั้งค่าอิมเมจสถานะที่เลือกไว้ดังนั้นจึงจำเป็นต้องกำหนดไว้ในแอตทริบิวต์รันไทม์ที่กำหนดโดยผู้ใช้และลบออกจากแอตทริบิวต์ SelectedImage ของรายการแถบแท็บ
ในกรณีของฉันฉันส่ง [UIImage imageNamed: @ ""] ซึ่งทำให้ฉันต้องแสดงคำเตือน เพียงเพิ่มเบรกพอยต์ในทุกบรรทัดที่คุณใช้ imageNamed และดีบักบรรทัดที่คุณพบคำเตือน
[UIImage imageNamed:@""]. คุณแก้ไขมันอย่างไร?
ifเพื่อทดสอบว่าชื่อรูปภาพไม่ใช่สตริงว่างเปล่าหรือใช้อิมเมจ "noImage" เริ่มต้นคุณจะแสดงภาพอย่างไรเมื่อไม่มีชื่อที่เกี่ยวข้องและ Assets ไม่มีรูปภาพ "noImage"
สิ่งนี้เกิดขึ้นกับฉันหลังจากสตอรีบอร์ดถูกแบ่งออกเป็นหลาย ๆ อัน (การเปลี่ยนแปลงที่เกิดขึ้นจริงเกิดขึ้นเมื่อฉันอยู่ในช่วงวันหยุดดังนั้นฉันจึงไม่รู้ว่ามันเป็นอย่างไร)
หลังจากการตรวจสอบของสตอรี่บอร์ด XML ที่ฉันพบว่าการอ้างอิงภาพซึ่งก่อนหน้านี้ได้ชี้ไปที่ "BottomBar" imageView:fFo-1g-jzs:imageในสินทรัพย์แคตตาล็อกแทนชี้ไปที่
ในตอนท้ายของไฟล์ XML ภายใต้<resources>แท็กชื่อแท็ก<image name="imageView:fFo-1g-jzs:image">ที่มีmutableDataหยดขนาดใหญ่
หลังจากรีเซ็ตการอ้างอิงรูปภาพในสตอรีบอร์ดและลบหยดแล้วข้อผิดพลาดก็หายไป
ฉันเพิ่งแก้ไขข้อผิดพลาดนี้ เพียงตรวจสอบการใช้งาน[UIImage imageNamed:(NSString*) imageName]ฟังก์ชั่น หากimageNameเป็นnilเช่นนั้นข้อผิดพลาดจะเกิดขึ้น
คุณกำลังให้ชื่อรูปภาพที่ไม่ถูกต้องดังนั้นจำเป็นต้องตรวจสอบความถูกต้องก่อนที่จะใส่ชื่อนั้นคุณสามารถทำตามวิธีใดก็ได้ที่เหมาะสมกับรหัสของคุณหรือชอบ
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
หวังว่าจะช่วยได้ !!!!
สาเหตุของข้อผิดพลาดกำลังส่งค่าศูนย์ไปยังเมธอด "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;
}
ฉันได้รับคำเตือนนี้เมื่อฉันโหลดการใช้รูปภาพ[[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]มากกว่าฉันเปลี่ยนเป็น[UIImage imageNamed:normalStr]คำเตือนก็หายไป
วิธีการหนึ่งคือทำวิธีการคลาส 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:]เช่นกัน
บางทีคุณสามารถใช้สิ่งนี้เพื่อยืนยันว่า "imageName" ไม่ใช่ "ศูนย์" จากนั้นคุณจะทิ้งคำเตือนนี้ไป
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}