ios делегаты выбора изображений не запускаются в nativescript - PullRequest
0 голосов
/ 26 февраля 2020

Я пишу плагин nativescript для средства выбора изображений. Я закончил с частью android. Сейчас я пишу код для ios. Он показывает диалог выбора изображения, но назначенные делегаты не запускаются. Пожалуйста, проверьте мой код ниже.

import * as application from "tns-core-modules/application";
import * as frame from "tns-core-modules/ui/frame"
export class Nativemediapicker extends NSObject implements UIImagePickerControllerDelegate {
    public static ObjCProtocols = [UIImagePickerControllerDelegate];
    get() {
        let version = NSBundle.mainBundle.objectForInfoDictionaryKey("CFBundleShortVersionString");
        return version;
    }
    static new(): Nativemediapicker {
        return <Nativemediapicker>super.new();
    }
    private _callback: (result?) => void;
    private _errorCallback: (result?) => void;
    public initWithCallbackAndOptions(callback: (result?) => void, errorCallback: (result?) => void, options?): Nativemediapicker {
        this._callback = callback;
        this._errorCallback = errorCallback;
        if (options) {
            // collect options
        }
        console.log('initWithCallbackAndOptions')
        return this;
    }
    static registerFileProvider(provider) { }
    static pickFiles(mimeType, onResult, onError) {
        onError("ERROR: For ios this feature is comming soon.");
    }
    static takePicture(onResult, onError) {
        // if (!UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) {
        //     onError("ERROR: For ios simulator this feature is not supported.");
        //     return
        // }
        let imagePicker = UIImagePickerController.new()
        imagePicker.delegate = Nativemediapicker.new().initWithCallbackAndOptions(onResult, onError, null)
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        imagePicker.allowsEditing = false
        // imagePicker.showsCameraControls = true
        let topMostFrame = frame.topmost();
        if (topMostFrame) {
            let viewController: UIViewController = topMostFrame.currentPage && topMostFrame.currentPage.ios;
            if (viewController) {
                while (viewController.parentViewController) {
                    // find top-most view controler
                    viewController = viewController.parentViewController;
                }

                while (viewController.presentedViewController) {
                    // find last presented modal
                    viewController = viewController.presentedViewController;
                }

                viewController.presentViewControllerAnimatedCompletion(imagePicker, true, null);
            }
        }
    }
    static recordVideo(onResult, onError) {
        onError("ERROR: For ios this feature is comming soon.");
    }
    static recordAudio(onResult, onError) {
        onError("ERROR: For ios this feature is comming soon.");
    }
    imagePickerControllerDidCancel(picker): void {
        console.log("imagePickerControllerDidCancel")
        this._errorCallback("ERROR: Image capturing cancelled.");
    }
    imagePickerControllerDidFinishPickingMediaWithInfo(picker, info): void {
        console.log("imagePickerControllerDidCancel")
        this._errorCallback("ERROR: Image capturing done.");
    }
}

Я не понимаю, что я делаю не так и где? Пожалуйста, помогите мне, ребята ...

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

После добавления этой строки в функцию takePicture все заработало.

imagePicker.modalPresentationStyle = UIModalPresentationStyle.CurrentContext;
0 голосов
/ 27 февраля 2020

Я подозреваю, что причина в том, что ваш делегат очищается сборщиком мусора. Одно важное правило для iOS заключается в том, что вы всегда должны сохранять ссылку на собственный объект в переменной JS, чтобы поддерживать его в действии.

Try,

private _delegate;

....

this._delegate = Nativemediapicker.new().initWithCallbackAndOptions(onResult, onError, null);
imagePicker.delegate = this._delegate;
...