Tabgroup iOS 选项卡不会打开新视图,给出 Obj-C 错误

Posted

技术标签:

【中文标题】Tabgroup iOS 选项卡不会打开新视图,给出 Obj-C 错误【英文标题】:Tabgroup iOS tab won't open new view, gives Obj-C error 【发布时间】:2017-04-20 15:45:17 【问题描述】:

android 上达到里程碑后,目前正在努力让我的应用程序的代码在 ios 端运行。我的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  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 中,您正在创建一个控制器,然后您正在调用可以正常工作的控制器的 open 方法。

所以这段代码肯定对你有用:

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();

【讨论】:

由于切换到此方法,Android 端的每个窗口都会在退出时关闭。我将每个 Android 窗口的 exitOnClose 设置为 false。对这种行为有什么想法吗? 没关系,我发现将 exitOnClose 添加到我的选项卡组中的根窗口会删除应用程序中其他窗口的行为。

以上是关于Tabgroup iOS 选项卡不会打开新视图,给出 Obj-C 错误的主要内容,如果未能解决你的问题,请参考以下文章

iOS:使用选项卡视图控制器更改故事板不会反映在模拟器上

打开“模态”窗口并在基于选项卡组的应用程序中关闭

单击选项卡后,相机/相册不会在 ios 上重新加载

从 django 视图中打开新选项卡的命令

iOS 以编程方式转到选项卡和推送视图控制器

在新选项卡/窗口中打开链接而不丢失当前 JSF 页面的视图范围