Xcode ที่ไม่มี Storyboard และ ARC


116

ฉันได้ดาวน์โหลด xcode-5 ใหม่และเพิ่งเริ่มใช้งาน

เราสามารถสร้างแอพพลิเคชั่นได้โดยตรงรวมถึงสตอรี่บอร์ดและ ARC โดยไม่ได้ขอตัวเลือกเหมือนเวอร์ชันก่อนหน้านี้

ดังนั้นคำถามของฉันคือเราจะใช้ xcode5 โดยไม่มี ARC และสตอรี่บอร์ดได้อย่างไร เราต้องลบไฟล์สตอรี่บอร์ดด้วยตนเอง? หรือมีตัวเลือกอื่น ๆ


3
ไม่มีใครตอบได้จริง แต่ฉันคิดว่า Apple ทำได้เพราะทั้ง Storyboards และ ARC คืออนาคตในการพัฒนาแอพด้วย Xcode หรือใน Objective-C เนื่องจาก Xcode 5 ยังคงเป็นเบต้าอาจเป็นไปได้ว่าพวกเขาเพิ่มการรองรับในปลายปีนี้ แต่ฉันคิดว่ามันจะไม่เกิดขึ้น
HAS

6
ลบไฟล์สตอรี่บอร์ดด้วยตนเองและลบ-fobjc-arcแฟล็กคอมไพเลอร์ในการตั้งค่าโปรเจ็กต์

19
คำถามเกี่ยวกับเครื่องมือที่โปรแกรมเมอร์ใช้เป็นหลักนั้นมีอยู่มากในหัวข้อโดยที่พวกเขาไม่ได้ขอคำแนะนำที่ 'ดีที่สุด' หรือคำแนะนำ 'การช็อปปิ้ง' ฉันได้เปิดอีกครั้งตามนั้น
Tim Post

1
แต่นี่ไม่ใช่สถานที่ที่เหมาะสมในการทำเช่นนั้น เข้าใจว่า
MZimmerman6

3
สิ่งเดียวที่ทำให้สิ่งนี้อยู่ภายใต้ NDA คือคำว่า "Xcode 5" part สิ่งที่อธิบายจริงสามารถทำได้ใน Xcode เวอร์ชันก่อนหน้าดังนั้นในทางเทคนิคหัวข้อนี้จึงมีอิสระที่จะพูดคุย
AtomRiot

คำตอบ:


150

สร้างโครงการด้วยแอปพลิเคชันว่างเปล่าและเพิ่มตัวควบคุมมุมมองใด ๆ (ฉันเพิ่ม TestViewController ที่นี่)

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
 {
   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   // Override point for customization after application launch.
   TestViewController *test = [[TestViewController alloc]     initWithNibName:@"TestViewController" bundle:nil];
   UINavigationController *nav = [[UINavigationController alloc]  initWithRootViewController:test];
   self.window.rootViewController = nav;
   [self.window makeKeyAndVisible];
   return YES;
 }

ขั้นตอนในการลบ ARC

1)ในการสร้างการตั้งค่าชุดอ้างอิงอัตโนมัตินับไปไม่มี

////////////////////////////////////////////////// ///////////////////////// END //////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////////////

หากคุณมีแอปพลิเคชันที่สร้างไว้แล้วพร้อมกระดานเรื่องราวและARCแล้ว

ขั้นตอนในการลบกระดานเรื่องราว

1)ลบไฟล์Main.storyboardออกจากโครงการของคุณ

2)เพิ่มไฟล์ใหม่ด้วย xib สำหรับคอนโทรลเลอร์ของคุณหากไม่ได้เพิ่มในซอร์สที่คอมไพล์แล้วในขั้นตอนการสร้างให้เพิ่มด้วยตนเอง

3)นำหลักกระดานชื่อฐานไฟล์จากplist

4)เปลี่ยนไฟล์appdelegate didFinishLaunchingWithOptionsและเพิ่ม:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;

[self.window makeKeyAndVisible];

เหมือนกับ :

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;

     // Override point for customization after application launch.

     TestViewController *test = [[TestViewController alloc]     initWithNibName:@"TestViewController" bundle:nil];
     UINavigationController *nav = [[UINavigationController alloc]  initWithRootViewController:test];
     self.window.rootViewController = nav;
     [self.window makeKeyAndVisible];

     return YES;
}


ในตัวอย่างข้างต้นคุณต้องจัดการการจัดการหน่วยความจำด้วยตนเองเช่น

 self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

 [test release]; 

ขั้นตอนในการลบ ARC

1)ในการสร้างการตั้งค่าชุดอ้างอิงอัตโนมัตินับไปไม่มี


7
ไม่มีตัวเลือก "โครงการว่าง" อีกแล้วหรือ ฉันไม่คิดว่าฉันจะเริ่มใช้สตอรี่บอร์ดทุกครั้ง
Sulthan

1
อย่าลืมเปลี่ยนการตั้งค่า "อินเทอร์เฟซหลัก" ของเป้าหมายเป็น <View Controller> รูทใหม่ของคุณ
Paul Brady

คุณพูดถูก @Sulthan เราสามารถทำได้โดยใช้โปรเจ็กต์ว่างเปล่า แต่นี่คือการเปลี่ยนแปลงหากฉันใช้แอปพลิเคชั่นตามมุมมองที่คัดลอกแล้ว (เราต้องลบโค้ดสตอรี่บอร์ดออกจากไฟล์ appDelegate ด้วยตนเอง) ในขณะที่อยู่ในแอปพลิเคชันว่างเราต้องเพิ่มรหัสใหม่ในนั้น :)
PJR

ฉันเจอสคริปต์ที่จะเพิ่มตัวเลือกในการลบสตอรีบอร์ดกลับ: stackoverflow.com/a/19792955/329928
Chris Leyva

เหตุใด UINavigationController * nav จึงไม่ปล่อยอัตโนมัติ และเราควรใช้ _window ใน [UIWindow จัดสรร]?
hariszaman

44

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

ใช้ขั้นตอนต่อไปนี้เพื่อละเว้นสตอรี่บอร์ด: ใส่คำอธิบายภาพที่นี่

  1. สร้างโครงการใหม่ด้วยเทมเพลต Empty Application
  2. เพิ่ม viewController ใหม่ (ตัวอย่าง: LoginViewController)
  3. เปลี่ยนไฟล์didFinishLaunchingWithOptionsในAppDelegate.mตามที่ระบุด้านล่าง

เปลี่ยนไป:

#import "LoginViewController.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc]  initWithRootViewController:loginVC];

    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

ลบ ARC: ไปที่ Build Setting -> Objective-C Automatic Reference Counting -> NO


1
ว้าว! ทำงานได้อย่างมีเสน่ห์และเรียบง่ายกว่าคำตอบที่ยอมรับ ฉันเพิ่งมีเพื่อให้แน่ใจว่าการเปลี่ยนแปลงทั้งหมดของการอ้างอิงเพื่อLoginViewControllerให้ตรงกับชื่อตัวควบคุมของตัวเองของ
JohnK

11

สร้างโครงการใหม่

! [สร้างโครงการใหม่]

ลบชื่อฐานของไฟล์สตอรี่บอร์ดหลักในข้อมูล

// ลบชื่อฐานของไฟล์สตอรี่บอร์ดหลักในข้อมูล

เพิ่มรหัสนี้ในผู้ร่วมประชุม

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];

    LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc]  initWithRootViewController:loginVC];

    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

จากนั้นนำสตอรีบอร์ดของคุณออกโดยอัตโนมัติ

โปรดลองสิ่งนี้ ... ดำเนินการสำเร็จ ขอบคุณ


5

ShortCut: ฉันชอบ

สร้างโปรเจ็กต์โดยไม่มี Storyboard และ ARC ใน xcode4 จากนั้นเปิดโปรเจ็กต์นั้นใน xcode5


1
การใช้ Xcode เวอร์ชันเก่ากว่านั้นไม่คุ้มค่า ฉันอยากจะสร้างโปรเจ็กต์ใหม่กำจัดเนื้อหา Storyboard เพิ่มอินสแตนซ์ UIWindow ใน appDelegate และบันทึกเป็นโปรเจ็กต์เทมเพลตในภายหลัง
kervich

3

Xcode 4 มีช่องทำเครื่องหมาย "ใช้สตอรี่บอร์ด" เมื่อคุณสร้างโครงการใหม่ เป็นไปได้ที่จะคว้าเทมเพลตแอปพลิเคชัน Xcode 4 เก่า (ไฟล์ XML) และแปลงเป็น Xcode 5 ด้วยวิธีนี้คุณจะได้รับเทมเพลตเก่ากลับคืนมาซึ่งให้คุณเลือกได้ว่าต้องการสตอรีบอร์ดหรือไม่


ฉันเขียนสคริปต์ที่ทำทุกอย่างให้คุณ: https://github.com/jfahrenkrug/Xcode4templates


หลังจากเรียกใช้สคริปต์คุณจะมีส่วน "Xcode 4" ในหน้าจอ "โครงการใหม่":

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

แล้ว - อนิจจา! - คุณจะได้รับตัวเลือกที่คุณรักกลับคืนมา:

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

คุณจะต้องมีสำเนาของชุด Xcode 4 .app จากhttp://developer.apple.com/iosเพื่อใช้สคริปต์นี้


1
อย่างไรก็ตามเทมเพลตเหล่านั้นเก่าและไม่ได้ใช้ประโยชน์จากการเปลี่ยนแปลงใหม่ทั้งหมดที่มีเช่น -registerClass: forCellReuseIdentifier :.
mahboudz

@mahboudz นั่นคือเรื่องจริง คุณต้องปรับแต่งว่าฟังก์ชันนั้นมีความสำคัญต่อคุณหรือไม่ แน่นอนฉันหวังว่า Apple จะนำตัวเลือกในการเลือกไม่ใช้ Storyboards ใน Xcode รุ่นต่อไป
Johannes Fahrenkrug

1
ฉันหวังว่าอย่างนั้น เช่นเดียวกับคุณฉันใช้ Storyboard ในแอปขนาดเล็กส่วนใหญ่เกิดจากการพัฒนา TableView ที่รวดเร็ว แต่ในแอปขนาดใหญ่ Storyboard เป็นความเจ็บปวดที่สำคัญ ตั้งแต่การเลื่อนไปรอบ ๆ จนถึงการจดจำรหัสการทำต่อ (พวกเขาต้องเพิ่มวิธีการใช้ #defines หรือ const NSString * ระหว่างสตอรี่บอร์ดและไฟล์ต้นฉบับ) ไปจนถึงการแก้ไขข้อขัดแย้งของคอมไพล์และอื่น ๆ สตอรี่บอร์ดไม่ใช่ทั้งหมดและ จบทั้งหมด
mahboudz

แม้ว่าลูกศร V / A เหล่านั้น
John Riselvato

1
@JohnRiselvato คุณพูดถูก :) ลูกศรที่น่ารังเกียจหายไปแล้ว :)
Johannes Fahrenkrug

0

ฉันมีเคล็ดลับ:

  1. อย่างแรก: ฉันสร้างโปรเจ็กต์โดยใช้ XCode 4.6 (เนื่องจากเวอร์ชันนี้ใกล้กับ XCode 5 มากที่สุด)
    • แน่นอนว่าด้วย XCode 4.6 คุณสามารถเลือกใช้หรือไม่ใช้ ARC, Storyboard
  2. อย่างที่สอง: หลังจากนั้นฉันจะเปิด Project ด้วย XCode 5 => ฉันคิดว่า Xcode 5 จะเข้าใจว่าโปรเจ็กต์นั้นใช้ nonARC และแน่นอนว่าไม่มี Storyboard

ฉันหวังว่าโครงการของคุณจะได้ผล! : D

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