Appcelerator模块 - 使用.xib实例化UIViewController?

时间:2013-08-15 09:38:24

标签: ios objective-c xcode appcelerator titanium-modules

我在使用它的.xib实例化UIViewController时遇到了问题。

我的代码如下所示:(实际上,请看这里:https://github.com/mrtnbroder/titanium-module-test

- (void)open:(id)args
{
    ENSURE_UI_THREAD(open, args);

    CustomViewController *viewController = [[CustomViewController alloc] initWithNibName:@"CustomViewController" bundle:nil];

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    [[TiApp app] showModalController:navigationController animated:YES];
}

我的.xib文件名为CustomViewController.xib

看起来像这样:

TestCamNavigationController.xib

然而,当我构建它时,我的应用程序看起来像这样:

iPhone Simulator

为什么呢?怎么了?

4 个答案:

答案 0 :(得分:1)

问题是你的笔尖不在主包中。您应该首先将所有笔尖复制到 module_folder / assets中的文件夹中。

将该文件夹重命名为Titanium.bundle。

所以你的目录结构看起来像 module_folder /assets/Titanium.bundle

这将确保您的笔尖在编译时被复制到模块中。

我在NSBundle上创建了一个类别:

//Shortcut if you want to name the bundle Titanium you'll be ahead of the game
+ (NSBundle *)titaniumBundle
{
    return [NSBundle titaniumBundleWithName:@"Titanium"];
}

//Bundles are put in a folder called modules inside the application's main bundle
+ (NSBundle *)titaniumBundleWithName:(NSString *)bundleName
{
    //Change this to accommodate the module's id
    static NSString *appId = @"com.companyname.module";
    NSString *bundlePath = [NSString stringWithFormat:@"modules/%@/%@.bundle", appId, bundleName];
    bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:bundlePath];

    return [NSBundle bundleWithPath:bundlePath];
}

然后,您将在您正在使用的文件中包含该类别并对其进行编码:

 CustomViewController *viewController = 
   [[CustomViewController alloc] initWithNibName:@"CustomViewController"
                                          bundle:[NSBundle titaniumBundle]];

然后你至少要从正确的目录中加载视图。

答案 1 :(得分:0)

你正在做故事板吗?

如果不是,请检查didFinishLaunchingWithOptions

中的AppDelegate方法
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

答案 2 :(得分:0)

这一行:

  CustomViewController *viewController = 
       [[CustomViewController alloc] initWithNibName:@"CustomViewController"
                                              bundle:nil];

建议你应该调用你的xib文件“CusomViewController.xib”。

<强>更新

通过编辑问题(以及您的评论),您会发现您正在为Appcelerator Titanium开发模块。

从我可以收集的信息来看,Titanium不使用Xib文件或viewControllers(它使用'View Proxies'代替)。根据{{​​3}},在Titanium中使用Xib文件是一个非常复杂的过程:

  

您需要将XIB转换为NIB。最简单的方法是将XIB添加到本机项目,编译项目,然后拉出NIB。将其转储到模块的资产中,然后从模块代码中引用它。 ...请注意,我们通常不使用NIB,除非我们有来自第三方的强迫我们的东西。只是以命令性方式而不是声明性地创建视图更容易。

因为我只知道原生,而不是Titanium,我无法帮助你进一步解决这个问题。但我建议您遵循Titanium文档,不要将其与本机iOS开发混淆。

答案 3 :(得分:0)

首先在你的xxxmodule.m

    -(void)startup
    {
        // this method is called when the module is first loaded
        // you *must* call the superclass
        [super startup];

        yourViewController *controller = [[yourViewController alloc] init];
        controller.delegate = self;
[[TiApp app] showModalController: controller animated: YES];

    }