在Swift框架中加载资源(例如storyboard)

时间:2014-07-27 16:14:03

标签: ios swift

我试图建立一个捆绑故事板的框架。我已经检查过,创建的.framework包含我的.storyboard文件(作为.storyboardc文件),并且已经获得了在运行时加载故事板的框架。然而,这是一个框架,我希望代码尽可能多样化,我觉得我目前的解决方案有点hacky。目前,我正在使用以下代码加载故事板:

let mainBundlePath: String = NSBundle.mainBundle().resourcePath
let frameworkBundlePath = mainBundlePath.stringByAppendingPathComponent("Frameworks/AuthenticationManager.framework")
let frameworkBundle = NSBundle(path: frameworkBundlePath)
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)

我注意到的一些事情可能有些问题:

  • 框架的路径(Frameworks/)可能会在将来发生变化,不应该依赖它?
  • 框架的名称可能会更改,但如果没有首先获得框架的NSBundle,则无法获取产品名称?
  • 框架并非真正捆绑(?),因此将它们作为捆绑加载可能会在将来产生无法预料的后果?

可能存在其他问题,上述问题的解决方案,或者上述问题可能不是问题,但我还没有想到它们。

这个问题可能更适合Code Review,但我觉得它也适合这里。如果它需要移动到那里,请随意这样做或告诉我这样做。

4 个答案:

答案 0 :(得分:50)

框架(从" Cocoa Touch Framework"模板创建)具有包标识符, 它存储在生成的框架包的Info.plist中。

捆绑标识符在常规目标设置中配置。 默认情况下,它是<organization prefix>.<framework name>

您可以使用此标识符找到框架,例如:

let frameworkBundle = NSBundle(identifier: "com.duffy.AuthenticationManager")
let storyboard = UIStoryboard(name: "Storyboard", bundle: frameworkBundle)

答案 1 :(得分:35)

这是一个更清洁的解决方案(不涉及框架标识符):

let storyboardName = "StoryboardName"
let storyboardBundle = NSBundle(forClass: self)
let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle)

如果此代码不在static方法内,请使用YourClass.self代替self

Swift 3的示例:

let storyboardBundle = Bundle(for: NumberPadViewController.self)
super.init(nibName: "NumberPadViewController", bundle: storyboardBundle)

答案 2 :(得分:6)

对于Swift 3/4,它现在只是Bundle:

 JSONObject obj = new JSONObject();
 obj.put("name", "JEAN-LUC PALMYRE");
 obj.put("srn", "120299364");

 JSONObject objEcc = new JSONObject();
 objEcc.put("a",a);
 objEcc.put("b",b);
 objEcc.put("k",k);
 objEcc.put("order",order);

 obj.put("ecc",objEcc);

答案 3 :(得分:4)

这是一个更好的方法来加载Swift 3中的bundle而不需要传递更可能失败的字符串

import json
import os
from subprocess import check_output

def find_one_artifact(pattern):
    # Make jfrog less talkative so that JSON parsing works
    os.environ['JFROG_CLI_LOG_LEVEL'] = 'ERROR'
    with open(os.getenv('HOME') + '/.jfrog/jfrog-cli.conf') as fp:
        conf = json.load(fp)
        for server in conf['artifactory']:
            output = check_output(['jfrog', 'rt', 's', '--server-id',
                                   server['serverId'], pattern])
            hits = json.loads(output)
            if hits and 'errors' not in hits:
                for hit in hits:
                    return server['url'] + '/' + hit['path']
    return None