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];
}