UIPickerView 不是交互式的

Posted

技术标签:

【中文标题】UIPickerView 不是交互式的【英文标题】:UIPickerView not interactive 【发布时间】:2020-01-17 01:18:09 【问题描述】:

我有一个应用程序,它从主应用程序“汉堡包”菜单中,如果选择了一个选项,我想显示一个 PickerView 供用户从中选择一个数字。

因为它需要在整个应用程序中都可以通过这个菜单访问,所以我在 AppDelegate.cs 中构建了 UIPickerView(因为那是 UINavigationController 代码所在的位置以及来自该菜单的位置)。

一切都正确显示:用户选择的菜单按钮 -> 菜单显示 -> 用户选择“显示选择器”按钮 -> 选择器显示所有项目。但是一旦选择器显示出来,你就不能滚动选项,我添加的“完成”按钮也不能注册点击。事实上,这个弹出窗口后面的 ViewController 中的文本字段可以在通过弹出窗口上点击。

我不知道为什么这个 UIPickerView 是非交互式的,有人有什么想法吗?

public override bool FinishedLaunching(UIApplication app, NSDictionary options)

    // create a new window instance based on the screen size
    window = new UIWindow(UIScreen.MainScreen.Bounds);

    // instantiate the navigation controller
    nav = new UINavigationController(new SplashController());

    vwNav = new UIView(nav.NavigationBar.Bounds);

    var pickerView = new UIPickerView(new CGRect(275f, (UIScreen.MainScreen.Bounds.Size.Height / 2) - (375f / 2), 275f, 375f));
    pickerView.ShowSelectionIndicator = true;
    var myPickerViewModel = new PickerViewModel(itemList);
    pickerView.Model = myPickerViewModel;

    myPickerViewModel.PickerChanged += (sender, e) => 
        var temp = myPickerViewModel.SelectedItem;
    ;

    // Set up toolbar
    var toolbar = new UIToolbar();
    toolbar.SizeToFit();
    toolbar.Hidden = false;

    UILabel titleLabel = new UILabel();
    titleLabel.Text = "Select an Item";
    titleLabel.Frame = new RectangleF(75, 13, 200, 20);

    UIButton doneButton = new UIButton(UIButtonType.Custom);
    doneButton.Frame = new RectangleF(40, 335, (float)200, 30);
    doneButton.SetTitle("Done", UIControlState.Normal);

    doneButton.TouchDown += (sender, e) =>
    
        pickerView.Hidden = true;
    ;

    toolbar.AddSubview(titleLabel);
    toolbar.AddSubview(doneButton);
    pickerView.AddSubview(toolbar);
    pickerView.Hidden = true;

    btnMenu = new UIButton(UIButtonType.Custom);
    btnMenu.Frame = new CGRect(vwNav.Frame.Right - 45, 0, 45, nav.NavigationBar.Bounds.Height);
    btnMenu.SetImage(imgMenu, UIControlState.Normal);
    btnMenu.SetImage(imgMenu, UIControlState.Selected);

    btnMenu.TouchUpInside += (object sender, EventArgs e) =>
    
        UIAlertView alert = new UIAlertView();
        alert.Title = "Settings";
        alert.AddButton("Open PickerView");
        alert.AddButton("Exit");

        alert.Dismissed += delegate (object alertSender, UIButtonEventArgs args)
        
            if (args.ButtonIndex == 0)
            
                pickerView.Hidden = false;
            
            else
                return;
        
    

    vwNav.AddSubviews(btnMenu, pickerView);
    nav.NavigationBar.Layer.BorderWidth = 2f;
    nav.NavigationBar.Layer.BorderColor = (UIColor.FromPatternImage(imgNavBar)).CGColor;
    nav.NavigationBar.AddSubviews(vwNav);

    // If you have defined a root view controller, set it here:
    this.window.RootViewController = nav;
    this.window.MakeKeyAndVisible();

    return true;

我删除了一些不相关的代码(一些 nav.PushViewController() 用于不同的屏幕和其他菜单选项)以尽可能保持清晰。

【问题讨论】:

【参考方案1】:

从您的代码中,vwNav 的框架为nav.NavigationBar.BoundspickerView 的框架为new CGRect(275f, (UIScreen.MainScreen.Bounds.Size.Height / 2) - (375f / 2), 275f, 375f),如果将pickView 添加到vwNav,则pickerView 超出了@987654329 的范围@。

请记住,视图不会在超出其父视图范围的情况下接收触摸事件

这就是您的问题的原因

解决方案:

我认为您不应该在AppDelegate.cs 中构建UIPickerView,而是在您的ViewController 中创建它。

您还可以在ViewController 中为Navigationbar 添加按钮:

    UIBarButtonItem btn = new UIBarButtonItem();
    btn.Image = UIImage.FromFile("Image");
    btn.Clicked += (sender, e) =>  System.Diagnostics.Debug.WriteLine("show picker"); ;
    NavigationItem.RightBarButtonItem = btn;

记得在 Viewcontroller 的视图中添加选择器。

参考:uinavigationitem 和 add-uibarbuttonitem-to-navigation-bar-in-xamarin-ios

如有任何问题,请随时问我:)。

【讨论】:

这是有道理的,但是为什么 UIAlertView 仍然可以正常工作?弹出菜单,我可以在上面选择按钮,并位于与 UIPickerView 相同的位置。 感谢您的帮助 Jack Hua!我所做的是创建一个自定义 UIAlertView,其中包含我的选择器和相关元素。我通过这种方式从 AppDelegate 获得全部功能。

以上是关于UIPickerView 不是交互式的的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 不是交互式的

UIPickerView 中的 UILabel 上的额外空间

原型 tableviewcell 内的 UIPickerView 没有选择指示器

UIPickerView非交互式

UITableView 和 UIPickerView 交互问题

iOS 7 中用于点击截断的 UIPickerView 交互区域