Вкладка iOS в Tabgroup не открывает новый вид, выдает ошибку Obj-C

В настоящее время я работаю над тем, чтобы код для моего приложения работал на iOS после того, как вехой стала Android. У меня есть вкладка в моей index.xml:

<Alloy>
  <TabGroup id="tabMenu" title="USHUD | Home" tabsBackgroundColor="Alloy.CFG.design.colors.hudGrey" tabsBackgroundSelectedColor="Alloy.CFG.design.colors.hudBlue">
    // ------------------------------------   SEARCH TAB  --------------------------------------------------
    <Require src="search_tab/search"/>
    // ------------------------------------ FAVORITES TAB --------------------------------------------------
    <Require src="favorites"/>
    // ------------------------------------   ABOUT TAB  ---------------------------------------------------
    <Require src="about"/>
  </TabGroup>
</Alloy>

и это контроллер index.js:

/**
 * The scoped constructor of the controller.
 **/
(function constructor() {
  //Alloy.CFG.tabGroup = index.getView('tabMenu');
  globalTabGroup = $.tabMenu;
  $.tabMenu.open();
})();

Я пытаюсь добавить представление в стек навигации вкладки поиска, когда кнопка нажимается в search_tab/search.xml:

<Alloy>
<Tab id='searchTab' class="homeTab" title="Search" icon='/images/search-1.png'>
    <Window id="searchWin" title="Property Search">
        <View class="vgroup" id="wrapper">
            <ImageView height="Titanium.UI.SIZE" left="20" id="hud_logo" image="/images/US.png"/>
            <Button class="button-default bottom" id="buttonSearch" onClick="startSearch" title="Begin Search" zIndex="1"/>
        </View>
    </Window>
</Tab>

search_tab/search.js:

// Arguments passed into this controller can be accessed via the $.args object directly or:
var args = $.args;

function startSearch(e){
  if(OS_ANDROID){
      Alloy.createController("search_tab/states").getView().open();
  }else if(OS_IOS){
      //Ti.API.debug('Current Window: '+Ti.UI.currentWindow);
      //Ti.API.debug('Current Tab: '+Ti.UI.currentTab);
      //Ti.UI.currentTab.open('search_tab/states');

    globalTabGroup.activeTab.open('search_tab/states');
    //$.searchTab.open('search_tab/states');

    //Alloy.Globals.tabGroup.activeTab.open('search_tab/states');
    //Alloy.createController("search_tab/states").getView().open();
  }
}

Я пробовал несколько разных подходов, пытаясь получить ссылку на активную вкладку, чтобы я мог вызвать эту вкладку open() функции и добавить следующий вид в стеке поиска вкладки поиска. Однако, как бы я ни старался, я получаю эту загадочную, расплывчатую ошибку.

[ERROR] :  Script Error {
[ERROR] :      column = 332;
[ERROR] :      line = 1;
[ERROR] :      message = "-[__NSCFString setIsManaged:]: unrecognized selector sent to instance 0x15e61000";
[ERROR] :      sourceURL = "file:///private/var/mobile/Containers/Bundle/Application/7D2E0E41-E28B-40F8-90D1-485279A0B8F6/USHUD.app/alloy/controllers/search_tab/search.js";
[ERROR] :      stack = "[native code]\ne@file:///private/var/mobile/Containers/Bundle/Application/7D2E0E41-E28B-40F8-90D1-485279A0B8F6/USHUD.app/alloy/controllers/search_tab/search.js:1:332";
[ERROR] :  }

В ходе исследований я обнаружил, что NSCFString - это оболочка для NSString, а isSetManaged - это переменная логического типа (?), Которая где-то получает строку (?). Я не знаю, как Obj-C, так что с моей стороны все это вывод о том, что на самом деле означает ошибка.

1 ответ

Решение

В iOS вы передаете строку в метод activeTab.open(), а не в оконный контроллер. Но в Android вы создаете контроллер, а затем вызываете открытый метод контроллера, который работает правильно.

Так что этот код определенно будет работать для вас:

index.js

/**
 * The scoped constructor of the controller.
 **/
(function constructor() {
  Alloy.Globals.globalTabGroup = $.tabMenu;
  $.tabMenu.open();
})();

search_tab / search.js:

// Arguments passed into this controller can be accessed via the $.args object directly or:
var args = $.args;

function startSearch(e){
  var statesWin = Alloy.createController("search_tab/states").getView();

  OS_IOS ? Alloy.Globals.globalTabGroup.activeTab.open(statesWin) : statesWin.open();
}
Другие вопросы по тегам