具有自定义视图的UIBarButtonItem

问题描述:

我尝试使用工具栏的自定义视图创建UIBarButtonItem。视图本身很好地显示,但是当我单击BarButton时,不会发生任何操作。它看起来像触摸事件不会从视图转发到UIBarButtonItem实例。我检查了响应链,我认为它看起来不错。我也搜索了互联网并检查了Apple的文档,但找不到任何提示。具有自定义视图的UIBarButtonItem

这里是我的代码:

g__objWeatherButton = new UIBarButtonItem[1]; 

    UIView l__objCustomView = g__objWeatherDisplay.InfoBarButton; // Returns a reference to my custom view 

    UIBarButtonItem l__objButton = new UIBarButtonItem(l__objCustomView); 

    l__objButton.Clicked += delegate {this.WeatherButtonEvent();}; // my action handler 
    l__objButton.Width = 200; 
    l__objButton.Enabled = true; 

    g__objWeatherButton[0] = l__objButton; 

    this.Items = g__objWeatherButton; // "this" is my UIToolbar object 

有人可以给我一个提示,问题出在哪里?或者一个工作代码示例(请在c#中 - 在Objective-C中找到了一些示例,但显然忽略了关键技巧;-)

没有什么特别的技巧。当您想要将自定义视图添加到工具栏或导航栏时,您应该订阅(并响应)该视图的事件。因此,不是使用UIView来保存图像,而是使用UIButtonType.Custom创建一个UIButton,并订阅该按钮的TouchUpInside事件。

您对其进行初始化像你UIView的事:

UIButton l__objCustomUIButton = UIButton.FromType(UIButtonType.Custom); 
//l__objCustomUIButton.SetImage(UIImage.FromFile("your button image"), UIControlState.Normal); 
l__objCustomUIButton.TouchUpInside += delegate { this.WeatherButtonEvent(); }; 
UIBarButtonItem l__objButton = new UIBarButtonItem(l__objCustomUIButton); 

只要确保你在声明类范围的按钮。

+0

海兰季米特里斯 我有这个想法太多,但我拒绝了,因为我以为会有一个更简单的方法。现在我已经在这种方式实现它,它工作正常。谢谢你的帮助! –

+0

不客气,很高兴我帮了忙。 –

+1

@Jörn请将答案标记为已接受,以便每个在*上搜索或阅读的人都会立即知道答案可用于问题。谢谢! – poupou

尽管答案让我朝着正确的方向,但仍然无法显示按钮。只有在我添加了下面的按钮后才显示图像。

l__objCustomUIButton.Frame = new System.Drawing.RectangleF(0,0,40,40);

问候 保罗

还有一个更简单的方法和自定义按钮现在像一个普通的工具栏按钮反应。

this.SetToolbarItems(new UIBarButtonItem[] { 
      new UIBarButtonItem(UIBarButtonSystemItem.Refresh, (s,e) =>  { 
       Console.WriteLine("Refresh clicked"); 
      }) 

      , new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace) { Width = 50 } 
      , new UIBarButtonItem(UIImage.FromBundle 
            ("wrench_support_white.png"), UIBarButtonItemStyle.Plain, (sender,args) => { 
       Console.WriteLine("Support clicked"); 
      }) 
     }, false);