选择选项后,iOS 11上的PhoneGap / Cordova再次选择显示弹出窗口



我在iPad上的iOS 11上使用PhoneGap有问题。如果单击选择,它将在弹出窗口中显示选项。选择一个后,弹出窗口短暂消失,选择更改中的选项,然后弹出弹出式重新出现。以下消息在XCode控制台中:

[Warning] Application tried to represent an active popover presentation: <UIPopoverPresentationController: 0x100c3e450>

编辑:弹出重新出现后,单击它时什么都不会发生。

选择选项后,如何获得选择以不重新启动弹出窗口?

这是使用最新的PhoneGap 7.0.1。

这只是一个普通的html选择:

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1 maximum-scale=1, user-scalable=no" />
<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline' 'unsafe-eval'">
<script type="text/javascript" src="cordova.js"></script>
</head>
<body>
<select>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
</body>
</html>

您可以在此处下载示例项目:

https://github.com/tomkincaid/selecttest

我正在通过直接打开平台/ios/selectTest.xcodeproj在xcode中运行此操作。

编辑:有两个选择,行为甚至是陌生人。

<select id="select1">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
<select id="select2">
<option value="4">Four</option>
<option value="5">Five</option>
<option value="6">Six</option>
</select>

单击Select1,它带有Select1选项的弹出窗口。

选择一个选项,弹出窗口短暂消失,然后再出现。

单击身体以使弹出弹出消失。

单击Select2。出现Select1弹出窗口。

单击身体以使弹出弹出消失。弹出窗口短暂消失,然后重新出现。

单击身体以使弹出弹出消失。

再次单击Select2。现在它显示正确的弹出窗口。

这似乎是iPad上所有应用程序的iOS 11上的uiwebview的问题,而不仅仅是phonegap/cordova。由于UIWebView被WKWebView贬值,因此Apple不太可能将其修复。在PhoneGap/Cordova使用WKWebView之前,我将此修复程序砍了在一起。基本上,它在选择上放置一个DIV,然后从自定义插件打开一个选择器。

index.html

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1 maximum-scale=1, user-scalable=no" />
<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline' 'unsafe-eval'">
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="PhonegapUtility.js"></script>
<script type="text/javascript">
function onBodyLoad() {
    document.addEventListener("deviceready", onDeviceReady, false);
}
function onDeviceReady() {
    addSelectButton('#selecta');
    addSelectButton('#selectb');
}
function addSelectButton(selectID) {
    var u = new PhonegapUtility();
    u.isIpad(function(resp){
        if (resp == 1) {
            var buttonID = selectID+"Button";
            if($(buttonID).length == 0) {
                $("body").append("<div id='"+buttonID.replace("#","")+"' onclick='showPicker(""+selectID+"");'></div>");
            }
            $(buttonID).css("position","absolute");
            $(buttonID).css("left",$(selectID).offset().left+"px");
            $(buttonID).css("top",""+$(selectID).offset().top+"px");
            $(buttonID).css("width",$(selectID).width()+"px");
            $(buttonID).css("height",$(selectID).height()+"px");
            // need to adjust this for margin and padding
        }
    });
}
function showPicker(selectID) {
    var optionArray = [];
    $(selectID).find('option').each(function(index,element){
        optionArray.push(element.text);
    });
    var u = new PhonegapUtility();
    u.showPicker(optionArray.join("|||"),$(selectID).prop('selectedIndex'),function(resp){
        $(selectID+" option")[resp].selected = true;
    });
}
</script>
</head>
<body onload="onBodyLoad();">
<select id="selecta">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<select id="selectb">
<option value="4">Option 4</option>
<option value="5">Option 5</option>
<option value="6">Option 6</option>
</select>
</body>
</html>

phonegaputility.h

#import <Cordova/CDV.h>
@interface PhonegapUtility : CDVPlugin <UIPickerViewDelegate,UIPickerViewDataSource>
@property (strong, nonatomic) NSString *callbackId;
@property (strong, nonatomic) UIPickerView *pickerView;
@property (strong, nonatomic) UIView *pickerWrappertView;
@property (strong, nonatomic) NSArray *pickerData;
- (void) isIpad:(CDVInvokedUrlCommand*)command;
- (void) showPicker:(CDVInvokedUrlCommand*)command;
- (void) pickerDone;
@end

phonegaputility.m

#import "PhonegapUtility.h"
#import "AppDelegate.h"
@implementation TomPhonegapUtility
@synthesize callbackId,pickerData,pickerView,pickerWrappertView;
- (void) isIpad:(CDVInvokedUrlCommand*)command {
    int iPad = 0;
    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) iPad = 1;
    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:iPad];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
- (void) showPicker:(CDVInvokedUrlCommand*)command {
    callbackId = [[NSString alloc] initWithString: command.callbackId];
    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    UIViewController *rootViewController = appDelegate.window.rootViewController;
    pickerData = [[command.arguments objectAtIndex:0] componentsSeparatedByString:@"|||"];
    float viewWidth = rootViewController.view.bounds.size.width; //[UIScreen mainScreen].bounds.size.width;
    float viewHeight = rootViewController.view.bounds.size.height; //[UIScreen mainScreen].bounds.size.height;
    UIToolbar *toolBar= [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, viewWidth, 44)];
    [toolBar setBarStyle:UIBarStyleDefault];
    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    UIBarButtonItem *barButtonDone = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                      style:UIBarButtonItemStylePlain
                                                                     target:self
                                                                     action:@selector(pickerDone)];
    toolBar.items = @[flex, barButtonDone];
    pickerView = [[UIPickerView alloc] init];
    [pickerView setDataSource: self];
    [pickerView setDelegate: self];
    [pickerView setFrame: CGRectMake(0, toolBar.frame.size.height, viewWidth, 180.0f)];
    pickerView.showsSelectionIndicator = YES;
    [pickerView selectRow:[[command.arguments objectAtIndex:1] intValue] inComponent:0 animated:NO];
    pickerWrappertView = [[UIView alloc] initWithFrame:CGRectMake(0, viewHeight-toolBar.frame.size.height-pickerView.frame.size.height, viewWidth, toolBar.frame.size.height + pickerView.frame.size.height)];
    pickerWrappertView.backgroundColor = [UIColor whiteColor];
    [pickerWrappertView addSubview:pickerView];
    [pickerWrappertView addSubview:toolBar];
    [rootViewController.view addSubview:pickerWrappertView];
}
- (void) pickerDone {
    int selectedIndex = (int) [pickerView selectedRowInComponent:0];
    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:selectedIndex];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:callbackId];
    [pickerWrappertView removeFromSuperview];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return [pickerData count];
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [pickerData objectAtIndex:row];
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
}

您可以尝试使用Release标志构建应用程序吗?类似:

cordova build --release ios

我能够在没有该版本标志的情况下重现问题,但是由于问题,问题就消失了。因此,我想知道这个问题的真正来源:真的在苹果方面吗?似乎在科尔多瓦(Cordova)方面...或者我缺少一些东西。

有关我的环境的一些信息可能很有用:

  • ios 11.0.1
  • Cordova CLI 6.5.0
  • Cordova-ios 4.4.0

编辑:我的不好,它完全与发行版构建无关,这仅仅是因为我的版本构建是在另一个Mac上完成的,在XCode8上运行。实际上,仅当您使用XCode 9构建应用程序时,此问题才会出现。Xcode 8的ios11建筑申请正在工作,因此我的建议是使用Xcode 8,直到我们在Apple或Cordova方面进行了可靠的解决方法。

来源:https://forums.developer.apple.com/thread/88169

刚碰到这个小故障。我发现这个插件可以帮助所有人:

https://github.com/apache/cordova-plugin-wkwebview-engine

基本上迫使Cordova使用WKWebView。只是一个免责声明...使用此操作后,我没有通过适当的浸泡测试来运行我们的应用程序,因此我不知道这是否会引起其他问题,但它确实可以解决选择问题。

目前在Cordova V.7.0.1和Cordova IOS平台4.4.0

最新更新