【问题标题】:App Shows Old XIB Instead of Storyboard应用程序显示旧的 XIB 而不是情节提要
【发布时间】:2014-08-01 21:31:45
【问题描述】:

我正在更新一个使用 XIB 文件但想要转换为 Storyboard 的旧 iOS 项目。我创建了我的 Storyboard,将它与适当的 ViewController 连接,删除了我可以找到的对 XIB 文件的所有引用,并将项目的主界面设置为使用我的 Storyboard。

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

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

  • 清理项目
  • 删除 DerivedData 文件夹
  • 重启 Xcode 和我的电脑
  • 更新了 MyApplication-info.plist
  • 从 XIB 文件中删除了对 ViewController 的引用
  • 尝试从项目中删除 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

【问题讨论】:

  • 包括您的-didFinishLaunchingWithOptions: 实现以及您如何呈现/推送viewController 的示例。理想情况下,您应该使用segue 转换到其他viewControllers。
  • 我的 -didFinishLauchingWithOptions: 函数为空;我确保删除了对 XIB 的引用。我也确实使用 segues 进行过渡(使用 Storyboard 时你怎么能不使用?:D)。
  • 只是检查。看起来不错,但我建议您为有问题的viewControllers 之一发布与 segue 相关的代码
  • 我唯一的segue代码是prepareForSegue,它只是调用下一个ViewController的函数。

标签: ios xcode storyboard xib uistoryboard


【解决方案1】:

在您的 appDelegate 类文件中,删除任何指示应用启动到旧初始 xib 的代码。 (从 didFinishLaunching' 方法中)您无需将其替换为任何代码即可启动情节提要,因为它是从“开发信息”部分中选择的 - 见下文。

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

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

另外,如果您从情节提要中选择您希望应用程序最初启动的视图控制器并选择它。然后转到 RHS 实用程序区域并确保选择了“Initial Scene [ ] Is Initial View Controller 块,请参见图片。

希望对你有帮助,

干杯

吉姆

【讨论】:

  • 是的,我已经涵盖了所有这些内容。从 Storyboard 中,初始 ViewController 是唯一正确显示的。所有其他使用 segues 的人都以某种方式转换回使用 XIB。
  • 您好 Robert,我认为您的 segue 是程序化的,在这种情况下您可以显示一些您的 segue 代码吗?
  • 嘿,Jeely,我不是以编程方式切换到下一个控制器;我有 Storyboard 来解决这个问题。我发布了我对 segues 所做的唯一事情,即将一个字符串传递给下一个 ViewController。
【解决方案2】:

在我继续使用的 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 文件,即使我删除了对它的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2012-08-22
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多