У меня относительно простой модальный диалог в гораздо большем приложении 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);
}