Модальное диалоговое окно JavaScript NativeScript завершается с ошибкой ViewHierarchy на iOS - PullRequest
0 голосов
/ 20 апреля 2019

У меня относительно простой модальный диалог в гораздо большем приложении NativeScript JavaScript, который при запуске завершается ошибкой с сообщением об ошибке,

CONSOLE ERROR file:///app/tns_modules/tns-core-modules/trace/trace.js:166:30: ViewHierarchy: Parent is already presenting view controller. Close the current modal page before showing another one!

Это отлично работает на Android, но не работает на iOS. Код следует за примером на https://docs.nativescript.org/ui/modal-view. тнс врач не показывает ошибок и весь код обновлен. Что меня озадачивает, так это выяснение того, что я могу изменить, поскольку это единственный модальный диалог во всем приложении.

Я бы приветствовал любые идеи.

Редактировать:

Я попробовал похожее, но более старое приложение, и там работает тот же модальный диалог, что и ожидалось. Но он работает под управлением версий 4.2.0 основных модулей и iOS.

✔ Component nativescript has 5.3.2 version and is up to date.
⚠ Update available for component tns-core-modules. Your current version is 4.2.0 and the latest available version is 5.3.1.
⚠ Update available for component tns-android. Your current version is 4.2.0 and the latest available version is 5.3.1.
⚠ Update available for component tns-ios. Your current version is 4.2.0 and the latest available version is 5.3.1.

Вот модальный диалоговый код, о котором идет речь:

/**
* Open Modal dialog to select phone number when multiple exist
* @param {object} page 
* @param {object} contact - object returned from getContact 
* @return {object} - Promise, result from selected contact, or null
*/
selectPhone = ((page, contact) => {
  return new Promise((resolve, reject) => {

    var modalPageModule = "views/phone-select-page";
    var fullscreen = false;

    var slept; // Promise for wait on iOS 

    // Wait briefly on iOS for contacts app to close (admittedly a hack)
    if (page.ios) {
      slept = myutils.sleep(50);
    } else {
      slept = Promise.resolve();
    }

    slept.then(() => {
      page.showModal(  // Ref: https://docs.nativescript.org/ui/modal-view
        modalPageModule,
        contact,
        ((response) => { // anonymous closeCallback function
          if (response) {
            resolve(response); // return promise with modified contact
          } else { // (handle back button press on Android)
            reject(response);
          }
        }), // end closeCallback function
        fullscreen
      ); // end page.showModal
    }); // end slept.then
  }); // end return New Promise
}); // end selectPhone

Вот само модальное диалоговое окно

<Page xmlns="http://www.nativescript.org/tns.xsd" shownModally="onShownModally" 
  xmlns:dd="nativescript-drop-down">
  <StackLayout class="modal-page">
    <Label class="instructions" textWrap="true" text="Select the phone number to use" />
    <dd:DropDown class="phones" items="{{ phones }}" selectedIndex="{{ phoneIndex }}" hint="Tap here to choose number" />
    <StackLayout class="hr"/>
    <GridLayout columns="*,*" rows="auto">
      <Button class="btn navbtn" col="1" tap="onOkTap" text="OK"/>
    </GridLayout>
  </StackLayout>
</Page>

А вот модальный файл .js:

var observableModule = require("tns-core-modules/data/observable");

var closeCallback;  // make modal closeCallback function global 

exports.onShownModally = function (args) {
  const page = args.object;
  var model = new observableModule.fromObject(args.context);
  page.bindingContext = model;
  closeCallback = args.closeCallback;
}

exports.onOkTap = function (args) {
  var page = args.object.page;
  var response = page.bindingContext; // use input context object as response object 
  response.phone = response.phones[response.phoneIndex];
  response.phone = response.phone.substr(response.phone.indexOf(":")).match(/\d/g).join("");
  page.closeModal();
  closeCallback(response);
}

1 Ответ

0 голосов
/ 22 апреля 2019

Похоже, проблема связана с синхронизацией, возвращающейся из приложения «Контакты» на iOS. Это было причиной для этого кода:

// Wait briefly on iOS for contacts app to close (admittedly a hack)
if (page.ios) {
  slept = myutils.sleep(50);
} else {
  slept = Promise.resolve();
}

(Увы, я сталкивался с этой же проблемой прошлым летом, когда первоначально разрабатывал этот код.) Если я изменяю задержку с 50 мс до 750 мс, код работает нормально. Я предполагаю, что это связано с изменениями в {N} 5. Итак, это все еще хак, но я могу жить с этим сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...