没有Storyboard和ARC的Xcode

115

我已下载新的Xcode-5并开始使用。

我们可以直接创建包含故事板和ARC的应用程序,无需像早期版本那样询问选项。

因此,我的问题是如何在没有ARC和故事板的情况下使用Xcode5。我们需要手动删除故事板文件吗?还是有其他选项?


3
没有人能真正回答这个问题,但我认为苹果这么做是因为使用Storyboard和ARC是在Xcode或Objective-C开发应用程序的未来趋势。由于Xcode 5仍处于测试版阶段,可能会在今年晚些时候添加对它们的支持,但我认为这不太可能发生。 - HAS
6
手动删除故事板文件,并在项目设置中移除 -fobjc-arc 编译器标志。 - user529758
19
关于程序员主要使用的工具的问题非常适合讨论,前提是它们不要求寻求“最佳”的东西或“购物”推荐。我已经相应地重新开放了这个话题。 - Tim Post
3
这个话题仅因“Xcode 5”一词而受到保密协议的限制。事实上,任何描述的内容都可以在之前的Xcode版本中完成,因此从技术上讲,这个话题是可以自由讨论的。 - AtomRiot
1
为了重新获得“使用故事板”选项,我找到了这个脚本:https://dev59.com/TGIk5IYBdhLWcg3wr_9o#19792955 - Chris Leyva
显示剩余5条评论
6个回答

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) 在构建设置中将自动引用计数设置为NO

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

如果您已经使用故事板ARC创建了应用程序,则

移除故事板的步骤

1) 从项目中删除Main.storyboard文件。

2) 为您的控制器添加新的 xib 文件,如果未在构建阶段的已编译源代码中添加,则手动添加。

3)plist中删除Main storyboard file base name

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) 在构建设置中将 自动引用计数(ARC) 设置为 NO


7
现在还有“空项目”选项吗?我不认为我会开始使用故事板。 - Sulthan
1
请确保将您的目标“主界面”设置为新的根<View Controller>。 - Paul Brady
你是对的,@Sulthan,我们可以通过空项目来实现,但如果我已经创建了基于视图的应用程序,则需要进行以下更改(我们必须手动从appDelegate文件中删除一些故事板代码),而在空应用程序中,我们需要添加新代码 :) - PJR
我发现了一个脚本,可以添加删除故事板的选项:https://dev59.com/TGIk5IYBdhLWcg3wr_9o#19792955 - Chris Leyva
为什么UINavigationController *nav没有自动释放?我们应该在[UIWindow alloc]中使用_window吗? - hariszaman

44

不要删除故事板文件,相反使用“Empty Application”模板创建一个新项目。这样您就可以避免创建故事板文件。

使用以下步骤省略故事板: enter image description here

  1. 使用“Empty Application”模板创建一个新项目。
  2. 添加一个新的视图控制器(例如:LoginViewController
  3. 按照下面指定的方式更改 AppDelegate.m 文件中的 didFinishLaunchingWithOptions 方法。

更改为:

#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: 前往构建设置 -> Objective-C自动引用计数 -> NO


1
哇!运行得非常好,比已接受的答案简单得多。我只需要确保更改所有对“LoginViewController”的引用以匹配我自己控制器的名称。 - JohnK

11

创建新项目

![创建新项目]

在 Info 中移除 Main storyboard 文件的基础名称

// 在 appdelegate 中添加以下代码

Add This Code In appdelegate

- (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

快捷方式:我更喜欢

在xcode4中创建不带Storyboard和ARC的项目,然后在xcode5中打开该项目。


1
为了这个而保留旧版本的Xcode是不值得的。我宁愿创建一个新项目,摆脱Storyboard的东西,在appDelegate中添加UIWindow实例化并将其保存为模板项目以备后用。 - kervich

3
当你创建一个新项目时,Xcode 4有一个“使用故事板”复选框。可以抓取旧的Xcode 4应用程序模板(XML文件)并将它们转换为Xcode 5。这样,您就可以获得旧的模板,让您选择是否要使用故事板。
我编写了一个脚本可以为您完成所有工作:https://github.com/jfahrenkrug/Xcode4templates 运行脚本后,您将在“新项目”屏幕中看到一个“Xcode 4”部分: enter image description here 然后,您可以再次选择您喜欢的选项: enter image description here 您需要从http://developer.apple.com/ios获取Xcode 4 .app捆绑包才能使用此脚本。

1
然而,这些模板已经过时,没有利用所有可用的新更改,例如-registerClass:forCellReuseIdentifier:。 - mahboudz
@mahboudz 那是真的。如果这个功能对你很重要,你需要进行调整。当然,我希望苹果公司会在未来的Xcode版本中重新提供退出Storyboards选项。 - Johannes Fahrenkrug
1
我也希望如此。像你一样,我在较小的应用程序中使用Storyboard,主要是因为快速开发TableView,但在较大的应用程序中,Storyboard是一个巨大的痛苦。从滚动到记住segue ID(他们必须添加一种在Storyboard和源文件之间利用#define或const NSString*的方法),到进行git冲突解决等等,Storyboard并不是万能的解决方案。 - mahboudz
那些 V/A 箭头啊。 - John Riselvato
1
@JohnRiselvato 你是对的 :) 现在讨厌的箭头已经消失了 :) - Johannes Fahrenkrug

0

我有一个小建议:

  1. 首先:我使用XCode 4.6创建我的项目(因为这个版本最接近XCode 5)。
    • 当然,使用XCode 4.6,你可以选择使用或不使用ARC、Storyboard。
  2. 其次:之后我会用XCode 5打开我的项目。 => 我认为Xcode 5会理解该项目是使用非ARC的,当然也没有Storyboard。

希望你的项目能够成功!:D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接