【问题标题】:adding UIButton to UIView or UINavigationBar doesn't work将 UIButton 添加到 UIView 或 UINavigationBar 不起作用
【发布时间】:2013-07-12 19:38:52
【问题描述】:

我正在尝试使用以下内容将 UIButton 添加到 UINavigationBar:

 UIButton * addSource = [UIButton buttonWithType:UIButtonTypeCustom];
    [addSource setBackgroundImage:[UIImage imageNamed:@"addsource.png"] forState:UIControlStateNormal];  
    [addSource addTarget: self action:@selector(addSourceButton:) forControlEvents:UIControlEventTouchUpInside]; 
    [addSource setFrame: CGRectMake(115, 5, 32, 32)];  
    [navBar addSubview:addSource];
    [addSource release];

但这不起作用,有什么想法吗?当我注释掉 setBackgroundImage 并将其更改为 setBackgroundColor 时,我可以看到它,但我似乎无法单击它(即:未触发它设置为的操作)。任何想法?将其更改为 UIImageView 而不是 UIButton 也可以,我可以很好地看到图像,所以这说明图像在那里。

【问题讨论】:

  • 这段代码在哪里? viewDidLoad?
  • 另外,你能显示navBar的代码吗?

标签: iphone objective-c ios uinavigationbar


【解决方案1】:

您不能将UIButton 添加到UINavigationBar。使用UIBarButtonItem

来自 Apple 文档:

与其他类型的视图不同, 您不直接将子视图添加到导航栏。相反,您使用 一个导航项(UINavigationItem 类的一个实例)到 指定要显示的按钮或自定义视图。

和:

条形按钮项是专门用于放置在 UIToolbar 上的按钮 或 UINavigationBar 对象。它从其继承了基本的按钮行为 抽象超类,UIBarItem。 UIBarButtonItem 定义了额外的 用于工具栏的初始化方法和属性 导航栏。

【讨论】:

    【解决方案2】:

    ” 向导航栏添加内容

    当您将导航栏用作独立对象时,您有责任提供其内容。与其他类型的视图不同,您不直接将子视图添加到导航栏。相反,您使用导航项(UINavigationItem 类的实例)来指定要显示的按钮或自定义视图。导航项具有用于指定导航栏左侧、右侧和中心的视图以及用于指定自定义提示字符串的属性。

    导航栏管理 UINavigationItem 对象的堆栈。尽管堆栈主要用于支持导航控制器,但您也可以使用它来实现自己的自定义导航界面。堆栈中最顶部的项表示其内容当前由导航栏显示的导航项。您可以使用 pushNavigationItem:animated: 方法将新导航项推送到堆栈上,并使用 popNavigationItemAnimated: 方法将项从堆栈中弹出。为了用户的利益,可以对这两种变化进行动画处理。

    除了推送和弹出项目之外,您还可以使用 items 属性或 setItems:animated: 方法直接设置您也可以使用堆栈的内容。您可以在启动时使用这些方法将界面恢复到之前的状态,或者一次推送或弹出多个导航项。

    如果您将导航栏用作独立对象,则应将自定义委托对象分配给委托属性,并使用该对象拦截来自导航栏的消息。委托对象必须符合 UINavigationBarDelegate 协议。委托通知可让您跟踪导航项何时从堆栈中推送或弹出。您可以使用这些通知来更新应用程序用户界面的其余部分。

    有关创建导航项的详细信息,请参阅 UINavigationItem 类参考。有关实现委托对象的更多信息,请参阅 UINavigationBarDelegate 协议参考。”

    来自 UiNavigationBar 类参考。

    请同时参考 UIBarButoonItem -(id)initWithCustomView:(UIView*)view。请注意 UIbutton 是 uiview 的子类

    也可以参考 uinavbaritem 的 rightBarButtonItem 属性 – setLeftBarButtonItems:动画: – setLeftBarButtonItem:动画: – setRightBarButtonItems:动画: – setRightBarButtonItem:动画: 和标题视图。

    【讨论】:

    • 但是我怎样才能把它加到中间呢?
    • UINavigationItem * navBarItem(当前 navbaritem); navBarItem.titleView = ;
    • 为什么在 UIView 中添加 UIButton 不起作用?另外,我如何从导航栏中获取 navigationbaritem
    • 请注意。添加子视图时,如果您的子视图位于超级视图用户操作的范围之外,则无法正常工作。但如果你还没有设置在超级视图中剪辑子视图,你可以。还是看看吧。
    • 如果您使用导航控制器,您可以使用我上面指定的方法。 UiNavigationcontroller 的 navbaritem ,因为它自动填充。但是如果您自定义添加了 uinavbar,那么只有您的子视图方法可以参考icab.de/blog/2009/10/13/…
    【解决方案3】:

    你必须使用 UIBarButton 项,代码如下:

    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissView)];
        self.navigationItem.leftBarButtonItem = cancelButton;
        [cancelButton release];
    

    【讨论】:

    • 这个加到leftBar,我要加到中心
    【解决方案4】:

    如果你想在导航栏的中心添加一些东西,你为什么不这样做

    navbar.titleView = addSource
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2014-09-08
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多