การแปลงเส้นทางไฟล์จาก NSString เป็น NSURL

ฉันทำงานผ่าน Cocoa ได้อย่างราบรื่น แต่ปัญหานี้ดูธรรมดามากจนยกเลิกสิ่งดีๆ ที่ฉันได้เรียนรู้ไปทั้งหมด :/

ฉันมีเส้นทางของไฟล์ที่สร้างขึ้น และจะต้องอยู่ในรูปแบบ NSURL จากการวิจัย นี่คือโค้ดที่ฉันเขียน:

NSLog(@"Old path = %@", pathToFile);
NSURL *xmlURL = [[[NSURL alloc] init] fileURLWithPath:pathToFile];
NSLog(@"New path = %@", [xmlURL absoluteString]);

และผลลัพธ์:

2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] Old path = file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml
2010-01-27 15:39:22.105 MusicLibraryStats[28574:a0f] New path = (null)

ก่อนอื่น alloc-init ไม่ควรจำเป็นด้วยซ้ำ ดูเหมือนคนอื่นๆ จะหนีไปได้ ในกรณีนี้ หากฉันไม่ alloc-init ฉันจะได้รับข้อผิดพลาด 'ตัวเลือกที่ไม่รู้จัก' ในบรรทัดนั้น แน่นอน ตอนนี้ฉันอายุมากขึ้นแล้ว (null)

ฉันโง่ที่ไหน?

ขอบคุณ!


person spamguy    schedule 27.01.2010    source แหล่งที่มา


คำตอบ (1)


[[NSURL alloc] init] ไม่ใช่แค่ไม่จำเป็น แต่ยัง ไม่ถูกต้อง fileURLWithPath: เป็นวิธีการเรียน ซึ่งหมายความว่าคุณสามารถเรียกได้เฉพาะบนวัตถุคลาสเท่านั้น (นั่นคือ NSURL เอง) ไม่ก่อให้เกิดข้อผิดพลาดในการคอมไพล์เนื่องจาก -(NSURL *)init ส่งคืนออบเจ็กต์ประเภท id และไม่ส่งผลให้เกิดข้อผิดพลาดรันไทม์เนื่องจาก -(NSURL *)init ส่งคืน nil จริง ๆ และข้อความที่ส่งไปยัง nil จะเรียงซ้อนอีก nil เป็นค่าที่ส่งคืน

โค้ดนี้ควรจะใช้งานได้:

NSString* pathToFile = @"/this/is/a/path";
NSURL* url = [NSURL fileURLWithPath:pathToFile];

ฉันพบปัญหาของคุณ -[NSOpenPanel URLs] ส่งคืนอาร์เรย์ของวัตถุ NSURL ซึ่งคุณถือเป็นวัตถุ NSString นั่นไม่ถูกต้อง คุณควรใช้สิ่งต่อไปนี้:

NSURL* url = [[oPanel URLs] objectAtIndex:0];

โปรแกรมดีบักเกอร์สามารถแสดงให้คุณเห็นว่าหากคุณดูที่ตัวแปร pathToFile อย่าลืมตรวจสอบในครั้งต่อไป :) การวางเมาส์เหนือตัวแปรจะทำให้คุณได้ประเภทของตัวแปร

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

person zneak    schedule 27.01.2010
comment
ฉันเห็น. ขอบคุณ. มีวิธีการใด (ถ้ามี) ในการเปลี่ยนสตริงที่ฉันมีตอนนี้ให้เป็นสิ่งที่คุณมี? เบรกพอยท์มีประโยชน์จริง ๆ แต่ฉันทำอะไรได้ไม่มากกับเบรกพอยท์ในสถานการณ์นี้ ฉันสามารถก้าวเข้าสู่ fileURLWithPath: ได้ แต่หากมีข้อผิดพลาดรันไทม์เกี่ยวข้อง (เช่นเมื่อฉันไม่ได้จัดสรร init) สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือตรวจสอบแอสเซมบลี - person spamguy; 28.01.2010
comment
สิ่งที่คุณต้องทำคือ: NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile]; หากคุณยังคงประสบปัญหา ปัญหาอาจอยู่ที่ pathToFile ใช้ดีบักเกอร์เพื่อค้นหา - person Alex; 28.01.2010
comment
ไม่ สตริงนั้นเป็นไฟล์ ol' ธรรมดาอย่างแน่นอนที่สุด file://localhost/Users/[username]/Music/iTunes/iTunes%20Music%20Library.xml มันถูกสร้างขึ้นโดยใช้ NSOpenPanel...pathToFile = [[oPanel URLs] objectAtIndex:0]; - person spamguy; 28.01.2010
comment
คุณต้องเรียกใช้เมธอด path บน NSUrl เพื่อรับพาธของไฟล์โดยไม่มีโปรโตคอลไฟล์ที่ด้านหน้า - person AshleyS; 28.11.2011