iOS 如何在 NativeScript 中显示打印机选取器

How to Display the Printer Picker in NativeScript on iOS

调用 UIPrinterPickerController 后,我无法在 NativeScript 中显示打印机选取器。

这是我的代码:

var printPicker = UIPrinterPickerController.printerPickerControllerWithInitiallySelectedPrinter(null);
console.log("printPicker: " + printPicker);
var found = printPicker.presentAnimatedCompletionHandler(false, function(printerPicker, userDidSelect, error) {
    if (error != null) {
        console.log("error: " + error);
    }
    console.log("printerPicker: " + printerPicker);
    console.log("userDidSelect: " + userDidSelect);
});
console.log("found: " + found);

这是输出:

CONSOLE LOG file:///app/pages/main/main-page.js:16:16: printPicker: <UIPrinterPickerController: 0x146e948b0>
2016-04-22 15:19:17.101 checkInApp[349:41167] WARNING: Calling -[UIPrinterPickerController presentAnimated:completionHandler:] on iPad
CONSOLE LOG file:///app/pages/main/main-page.js:24:16: found: true
CONSOLE LOG file:///app/pages/main/main-page.js:16:16: printPicker: <UIPrinterPickerController: 0x146e948b0>
2016-04-22 15:19:19.627 checkInApp[349:41167] WARNING: Calling -[UIPrinterPickerController presentAnimated:completionHandler:] on iPad
CONSOLE LOG file:///app/pages/main/main-page.js:24:16: found: false
CONSOLE LOG file:///app/pages/main/main-page.js:21:20: printerPicker: <UIPrinterPickerController: 0x146e948b0>
CONSOLE LOG file:///app/pages/main/main-page.js:22:20: userDidSelect: false

收到关于如何在 NativeScript 中调用它的回答 后,我可以验证我的回调确实运行了。但是,如果我点击一次运行上述代码的按钮,则不会触发回调(我假设这是选择器应该显示的点。);然后,如果我再次点击它,回调将触发,并且 userDidSelect 为 false。

我读到您可以使用 printerPickerControllerParentViewController 的子类来控制选择器的显示,但我认为它默认只显示主视图中的选择器。

如何从 NativeScript 中显示选择器?

更新

它似乎在带有 PrinterSimulator 运行 的 iOS 模拟器上运行良好。

更新 2

实际上,它正在 iPhone 6 模拟器上工作。它不适用于 iPad 模拟器或实际的 iPad 设备。我想我在某处读到选择器需要作为 PopOver 打开,但我不确定如何实现它。任何帮助将不胜感激。

好的,问题是您必须在 iPad 上的弹出窗口中打开 UIPrinterPickerController。所以我们需要检测应用 运行 所在的设备并调用适当的方法。这是如何完成的:

if ( ! UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiomPad) {
    printPicker.presentAnimatedCompletionHandler(false, completionHandler);
} else {
    printPicker.presentFromRectInViewAnimatedCompletionHandler(view.frame, view, false, completionHandler);
}

我仍在寻找对 viewview.frame 的引用 - 我有一个

更新

。基本上,在 loaded 处理程序中,您使用 args.object.ios.view.

获得对 view 的引用