2013-08-15 3 views
1

У меня возникли проблемы с созданием UIViewController с его .xib.Модуль Appcelerator - запускает UIViewController с .xib?

Мой код выглядит следующим образом: (на самом деле, просто посмотрите здесь: 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

Почему? что не так?

+0

Вы использовали Раскадровка? – Raptor

+0

Я добавил файл раскадровки один раз, но потом удалил его. Зачем? В любом случае это имеет значение? –

+0

Да, если вы начнете проект в качестве шаблона раскадровки, по умолчанию он будет сначала искать раскадровку и установить представление корня в качестве вида просмотра Storyboard. – Raptor

ответ

0

Вы делаете с sotryboard ??

если не чем проверить ваш метод didFinishLaunchingWithOptions в AppDelegate

self.window.rootViewController = navigationController; 
[self.window makeKeyAndVisible]; 
+0

Я не использую раскадровку. Кроме того, я разрабатываю модуль для Appcelerator Titanium (https://tinyurl.com/of8cnwm), поэтому у меня нет доступа к 'didFinishLaunchingWithOptions'. Вы можете просмотреть весь проект здесь: https://github.com/mrtnbroder/titanium-module-test –

0

Эта линия:

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

предлагает вам следует вызвать файл XIb "CusomViewController.xib".

обновление

С вашим вопросом редактирования (и ваши комментарии) сообщаемой, что вы разрабатываете модуль для Appcelerator Titanium.

Из того, что я могу собрать, Titanium не использует Xib-файлы или viewControllers (вместо этого он использует «View Proxies»). Согласно this answer, используя XIb файлы в Titanium является очень запутанным процесс:

Вы должны преобразовать XIB в СИБ. Самый простой способ - добавить XIB в собственный проект, скомпилировать проект, а затем вытащить NIB. Дамп его в активах для модуля, а затем ссылку на него из кода модуля. ... Обратите внимание, что мы обычно не используем NIB, если у нас нет чего-то от третьей стороны, которая заставляет нас. Легче просто создавать взгляды императивно, а не декларативно.

Поскольку я знаю только родной, а не титановый, я не могу помочь вам в дальнейшем. Но я предлагаю вам следовать документации Titanium и не путать ее с разработкой iOS.

+0

Простите, я не понимаю, что вы имеете в виду. Вы предлагаете вызвать 'initWithNibName: @" CustomViewController.xib "'? –

+0

№. Вызвать initWithNibName: @ «CustomViewController», но смените имя файла xib (в настоящее время с именем TestCamNavigationController.xib) на «CusomViewController.xib». ИЛИ альтернативно ... не меняйте имя xib-файла, но меняйте код на initWithNibName: @ "TestCamNavigationController". Но это имя кажется немного вводящим в заблуждение, так как это xib нестандартного контроллера, а не xib навигационного контроллера. – foundry

+0

Не работает. Изменено имя, но я все равно получаю тот же экран, что и выше. Обновлен код в Github. –

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]; 

    } 
+0

Извините, но что это значит для делегатского протокола? И почему 'init', а не' initWithNibName'? –

+0

да, вы можете initWithNibName. Вы должны установить делегат для контроллера в своем модуле. Потому что ваш модуль связан с титаном, и для этого нам нужно установить делегат. Вы пробовали этот код? Это работает? –

+0

Я попробовал. Не работает. Ошибка скрипта [ERROR] Не удалось загрузить NIB в пакете: «NSBundle (загружен) 'с именем' CustomViewController'' –

1

Проблема заключается в том, что ваш СИБ не в главном расслоении. Сначала вы должны скопировать все ваши наконечники в папку в module_folder/активы.

Переименуйте эту папку как-то вроде 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]]; 

Тогда вам По крайней мере, я буду загружать представление из нужного каталога.

+0

славный улов с категорией :) Мне нужно сделать акцент на том, что файл nib должен быть в комплекте, а не xib. – TheFuquan

Смежные вопросы