เปลี่ยนชื่อคลาสใน Xcode: Refactor …เป็นสีเทา (ปิดใช้งาน) ทำไม?


คำตอบ:


181

เลือกสัญลักษณ์ชั้นในไฟล์ส่วนหัวของมัน - @interfaceคือบิตหลัง จากนั้นควรเปิดใช้งานการปรับโครงสร้างใหม่


ไฟล์ส่วนหัวของชั้นเรียนมีเฉพาะ @interface ไม่มี @class แต่การเลือกสัญลักษณ์หลัง @interface ดูเหมือนจะใช้ได้
Elliot

3
@class if for forward declarations … s
Jonathan Sterling

สิ่งนี้รบกวนฉันมาระยะหนึ่งแล้วเช่นกัน ขอบคุณ!
Jonatan Hedborg

แม้สิ่งนี้จะไม่เปิดใช้งานการปรับโครงสร้างใหม่ใน xcode 4 ฉันก็สิ้นหวังแล้วทำไม apple ถึงไม่ปรับปรุงการปรับโครงสร้างใหม่ มี Eclipse ให้ติดตามวิธีทำ!
karim

@karim - ไม่เคยทำงานใน Xcode ดูคำตอบของฉันด้านล่างสำหรับวิธีแก้ปัญหาที่ใช้งานได้ทุกครั้ง
อดัม

26

หากคุณใช้ Objective-C ++ (เช่นผสม Objective-C กับรหัส C ++) การปรับโครงสร้างใหม่จะถูกปิดใช้งานใน xcode เนื่องจากไม่สนับสนุนการปรับโครงสร้างโค้ด C ++


เศร้ามากเกือบ 2 ปีต่อมาและยังคงไม่ปรับโครงสร้างวัตถุ Objective-C
christophercotton

@christophercotton ลองเกือบ 8 ปีต่อมาก็ยังไม่ได้ใช้งาน
Alex

7

Refactor อาจถูกปิดใช้งานหากไฟล์ที่ได้รับผลกระทบ (ส่วนใหญ่เป็นไฟล์ที่มีคลาสของคุณอยู่) ไม่ได้บันทึกไว้


1
การบันทึกไฟล์ xib ในตัวสร้างอินเทอร์เฟซเปิดใช้งานการรีแฟคเตอร์ให้ฉันอีกครั้งเมื่อเปิดใช้งาน Xcode ใหม่ก็ไม่ได้ช่วยอะไรขอบคุณ!
Vincent Gable

1
+1 สำหรับสิ่งนี้ บางมุมของ XCode ยังมีพื้นที่ขรุขระและนี่คือหนึ่งในนั้น บางครั้งหากการบันทึกไม่เปิดใช้งานการปรับโครงสร้างใหม่จะสร้างใหม่
memmons

6

ฉันใช้ Xcode เป็นเวลา 5 ปีแล้วและการปรับโครงสร้างใหม่ไม่เคยทำงานอย่างถูกต้อง (แม้แต่ xcode 4.6 ก็มีข้อบกพร่องที่สำคัญซึ่งจะทำให้ซอร์สโค้ดของคุณเสียหาย!)

วิธีแก้ปัญหาอยู่เสมอ (ยังคงใช้งานได้ 100% แม้ในกรณีที่รหัสของ Apple ล้มเหลว)

  1. ใช้ shift-command-f เพื่อค้นหาการใช้งานทั้งหมดของไฟล์
  2. เลือก "แทนที่" ในการตั้งค่าการค้นหา
  3. "แทนที่ทั้งหมด"
  4. ทำสิ่งต่อไปนี้สำหรับไฟล์. h และทำซ้ำสำหรับไฟล์. m (ถ้าคุณมี):
    1. คลิกขวาที่ไฟล์ต้นฉบับแล้วเลือก "show in finder"
    2. ลบไฟล์จาก xcode (เลือก "ลบการอ้างอิงเท่านั้น" เมื่อถูกถาม)
  5. เปลี่ยนชื่อ. h (และ. m ถ้าคุณมี) ใน Finder
  6. ใน Xcode เลือก "Product -> (กด Alt) -> Clean Build Folder"
  7. ออกจาก xcode (โดยปกติคุณสามารถหลีกเลี่ยงได้โดยไม่ทำสิ่งนี้ - แต่หมายเหตุ: มีข้อผิดพลาด MAJOR อื่น ๆ ใน Xcode ซึ่งจะขัดข้องเองหากคุณไม่ทำเช่นนี้)
  8. เปิด xcode อีกครั้ง
  9. ลาก / วาง. h และ. m กลับเข้าไปใน Xcode
  10. รอสักครู่ (วิธีการหลักของ Xcode บางส่วนเป็นแบบอะซิงโครนัส - ทำให้โครงการของคุณเสียหาย)
  11. ในที่สุดเมื่อดูเหมือนว่าจะไม่ทำอะไรเลย (และฮาร์ดดิสก์ของคุณไม่ส่งเสียงรบกวนอีกต่อไป): cmd-b เพื่อสร้างใหม่

ฉันมีอัตราความสำเร็จ 100% ด้วยวิธีนี้ ฉันเพิ่งลองปรับโครงสร้างใหม่ด้วย "Refactor -> Rename" ของ Apple ใน xcode ล่าสุดและล้มเหลวอีกครั้ง!

(คราวนี้เกิดข้อผิดพลาดที่ไม่ถูกต้อง: "ไม่สามารถระบุภาษาของ" ซึ่งเป็นหนึ่งในข้อความแสดงข้อผิดพลาดที่ Apple ใส่ข้อความผิด)


ใช่ฉันลองสิ่งนี้เมื่อเร็ว ๆ นี้ (พฤษภาคม 2014) และตัวเลือกเมนู "refactor" อย่างเป็นทางการของ Xcode ยังใช้งานไม่ได้ แต่ยังคงทำให้ซอร์สโค้ดของคุณเสียหาย ฉันแปลกใจที่พนักงานของ Apple ไม่ใส่ใจกับเรื่องนี้
อดัม

3

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

หลังจากนั้นที่xcode -> Project Navigatorฉันจะลบไฟล์

ในตอนท้ายฉันคลิกขวาที่ชั้นเรียนและเพิ่มไฟล์ลงใน ...และเพิ่มไฟล์เหล่านี้อีกครั้ง

มันได้ผลสำหรับฉัน


2

สำหรับฉันฉันรู้ว่า Refactor ถูกปิดใช้งานเนื่องจากโปรเจ็กต์ Xcode ที่ฉันเปิดนั้นอ้างถึง Base SDK ที่หายไป แก้ไขการตั้งค่าโครงการและในแท็บ Build ตั้งค่า Base SDK เป็นที่คุณมี (เช่นสำหรับฉันนี่คือ iOS 4.2) สิ่งนี้เปิดใช้งาน Refactor สำหรับฉัน


1

นอกจากนี้อาจเกิดขึ้นได้เมื่อคุณเปลี่ยนชื่อไฟล์สำหรับคลาสไม่ว่าจะเป็น xcode นอกหรือโดย ctrl คลิกชื่อไฟล์แล้วเปลี่ยนชื่อ xcode ปฏิเสธที่จะ refactor หากชื่อไฟล์ไม่ตรงกับชื่อคลาส


1

ไปที่ไฟล์ส่วนหัวของชั้นเรียนและค้นหาบรรทัดที่คล้ายกับสิ่งนี้:

@interface YourClassName

คลิกขวาที่สัญลักษณ์คลาส (เช่น YourClassName) และคุณจะสามารถเลือก Refactor -> Rename ...

ฉันเพิ่งลองสิ่งนี้และใช้งานได้ใน Xcode 5


0

มีปัญหานี้เช่นกัน ฉันพยายามค้นหา SDK ที่หายไปบันทึกไฟล์และค้นหารหัส Objective-C ++ ตามที่กล่าวไว้ข้างต้นและสิ่งที่ต้องใช้ในการแก้ไขเครื่องของฉันคือการรีบูต XCode

ดูเหมือนรถเล็ก ๆ ยังคงอยู่

BTW นี่คือสำหรับ XCode 4.0.1


-1

การรีแฟคเตอร์ใช้งานได้หากคุณเปลี่ยนชื่อไฟล์ในตัวนำทางโปรเจ็กต์ก่อน

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