动态加载故事板

4

我正在开发一个Storyboard加载系统,需要检查特定的Storyboard是否存在。

我写了一个函数来检查它(给定特定的Storyboard名称):

(NSString *)ressourceNameForDevice:(NSString *)rootName extension:(NSString *)ext
{
    NSString *retString = rootName;
    NSString *iPadString = [NSString stringWithFormat:@"%@-iPad", rootName];
    NSString *iPhoneWideString = [NSString stringWithFormat:@"%@-wide", rootName];

    if (IS_IPAD &&
        (nil != [[NSBundle mainBundle] pathForResource:iPadString ofType:ext]))
    {
        retString = iPadString;
    }

    if (IS_IPHONE_WIDE &&
        (nil != [[NSBundle mainBundle] pathForResource:iPhoneWideString ofType:ext]))
    {
        retString = iPhoneWideString;
    }

    return retString;
}

我正在使用@"storyboard"作为扩展参数调用此函数。
我的问题是,即使故事板在我的项目和包中存在,函数在nil != [[NSBundle mainBundle] pathForResource:iPhoneWideString ofType:ext]行失败,它仍然无法被找到。我猜我应该给它另一个扩展名,我也尝试过使用@"nib",但没有更多的结果。
有人知道如何检查这个吗?

那么 [UIStoryboard storyboardWithName:@"xxx" bundle:nil] 呢? - Larme
我编写的方法被称为填充此函数的@"xxx"部分,因为对于_Hello.storyboard_,有一个_Hello-wide.storyboard_和一个_Hello-iPad.storyboard_。 - shinyuX
2个回答

6

问题已解决。问题在于一旦Storyboard被编译,资源扩展名不是.storyboard而是.storyboardc,与.xib编译文件的.nib扩展名相同。


-1
假设您的项目中有要加载的“xyz.storyboard”,那么请写成:
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"xyz"
                                                             bundle: nil];

它应该做必要的事情。


谢谢您的回答。事实上,我已经使用了这种方法,但我的问题在于我有xyz.storyboardxyz-wide.storyboardxyz-iPad.storyboard。我编写的方法检查设备类型以及实际存在的xyz.storyboard(如果在iPhone上),xyz-wide.storyboard(如果在iPhone 4英寸上)或xyz-iPad.storyboard(如果在iPad上)。我只需要知道如何在加载之前验证storyBoard的存在。 - shinyuX
如果您尝试通过将“xyz-wide”作为参数来加载xyz-wide.storyboard,并且得到了nil,则表示该故事板不存在。 - TorukMakto
我理解你的意思,但在尝试加载之前,我想先检查一下它是否存在。 - shinyuX

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