应用程序显示旧XIB而不是故事板

时间:2014-06-11 17:55:04

标签: ios xcode storyboard xib uistoryboard

我正在更新一个使用XIB文件但希望转换为Storyboard的旧iOS项目。我创建了Storyboard,将其与相应的ViewControllers连接,删除了我可以找到的任何对XIB文件的引用,并将项目的主界面设置为使用我的Storyboard。

然而,当我运行我的应用程序时,它仍然显示XIB文件而不是使用Storyboard;好像还有一些东西仍在引用它们。显示Storyboard的唯一一个是初始场景/ ViewController(它很可能是因为它是一个新创建的ViewController)。

我在网上查看了其他解决方案,但无济于事。我试过了:

  • 清洁项目
  • 删除DerivedData文件夹
  • 重新启动Xcode和我的电脑
  • 更新了MyApplication-info.plist
  • 从XIB文件中删除了对ViewControllers的引用
  • 尝试从项目中删除XIB文件(因为文件丢失,它会显示黑屏)

原始项目目标是iOS 5.1,新的6.0,我正在使用Xcode 5.我可能会遗漏任何东西吗?


编辑:我没有以编程方式与其他控制器进行隔离;我有故事板处理这个。我在第一个ViewController中做的唯一事情是将字符串文本发送到下一个:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NextViewController *   nextController;

    if ([[segue identifier] isEqualToString:@"SegueToNext"])
    {
        nextController = [segue destinationViewController];
        [nextController initWithTitle:@"New"];
    }
}


编辑:这是显示XIB文件而不是Storyboard的ViewController的代码。如您所见,没有与加载/推送新控制器或与XIB相关的任何内容相关的调用。

#import "NextViewController.h"

@interface NextViewController ()

@end

@implementation NextViewController


-(id) initWithTitle:(NSString *) title
{
    self = [super init];
    if (self)
    {
        self.title = title;

        // Load the dictionary
        self.dictionary = [NSDictionary dictionaryWithContentsOfFile:
            [[NSBundle mainBundle] pathForResource:@"NewDictionary"
            ofType:@"plist"]];
    }

    return self;
}


-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Render new slide
    [self renderOpening];
}


-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}


-(void) renderOpening
{
    // 1st slide
    NSLog(@"renderOpening");

    // Initial settings for opening slide; all are UIOutlets (UIButton, UIImageView)
    back.hidden = YES;
    diagram.hidden = YES;
    next.hidden = NO;
    text.hidden = NO;
    avatar.hidden = NO;

    avatar.image = [[UIImage imageNamed:@"avatar"]
        rescaleImageToSize:CGSizeMake(150, 150)];

    text.text = @"Hello World";
}

@end

2 个答案:

答案 0 :(得分:0)

在appDelegate类文件中,删除任何指示应用程序启动到旧的初始xib的代码。 (在didFinishLaunching'方法中)你不需要用任何代码替换它来启动故事板,因为这从“开发信息”部分选择它 - 见下文。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

然后点击您的项目并在“开发信息”部分的“常规”选项卡下,确保您的故事板被选为主界面 - 见下图。

enter image description here

此外,如果您从故事板中选择您希望应用程序最初开始的视图控制器并选择它。然后转到RHS实用程序区域并确保选择“初始场景[]是初始视图控制器块”,请参见图片。

enter image description here

我希望这有帮助,

干杯

吉姆

答案 1 :(得分:0)

在我想要的ViewController中,我调用了一个自定义函数,它返回对ViewController类本身新创建的对象的引用:

-(id) initWithTitle:(NSString *) title
{
    self = [super init];
    if (self)
    {
        self.title = title;

        // Load the dictionary
        self.dictionary = [NSDictionary dictionaryWithContentsOfFile:
            [[NSBundle mainBundle] pathForResource:@"NewDictionary"
            ofType:@"plist"]];
    }

    return self;
}

旧代码留在那里,我完全忽略了它。现在我不再需要使用Storyboard了。因此,它没有看到我正在进行的ViewController,而是显示了旧的XIB文件。从项目中删除XIB文件显示一个空的黑色视图,删除代码 [super init] 显示正确的Storyboard ViewController。

虽然我得到了它的工作,但我仍然不确定为什么它显示旧的XIB文件,即使我删除了对它的引用。