【问题标题】:UIBarButtonItem with UIButton as custom view doesn't show upUIBarButtonItem 与 UIButton 作为自定义视图不显示
【发布时间】:2016-02-29 12:37:58
【问题描述】:

我正在尝试将自定义 UIButton 显示为 UINavigationItemrightBarButtonItem
我写了以下代码:

UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeCustom];
[inviteButton setTitle:@"Invite" forState:UIControlStateNormal];
inviteButton.frame = CGRectMake(0, 0, 30, 30);
inviteButton.backgroundColor = [UIColor redColor];
inviteButton.layer.borderColor = [UIColor blueColor].CGColor;
inviteButton.layer.borderWidth = 1.0f;

UIBarButtonItem *inviteButtonContainer = [[UIBarButtonItem alloc] initWithCustomView:inviteButton];
viewController.navigationItem.rightBarButtonItem = inviteButtonContainer;

我的导航栏中没有显示任何内容。

但是,使用以下代码,我可以看到一个基本按钮:

UIBarButtonItem *inviteButton = [[UIBarButtonItem alloc] initWithTitle:@"Invite"
                                                                 style:UIBarButtonItemStyleDone
                                                                target:self
                                                                action:nil];

viewController.navigationItem.rightBarButtonItem = inviteButton;
但这显然不是我所追求的,因为我正在寻找按钮外观。


编辑
我试图将UIBarButtonItem (inviteButtonContainer) 的相同实例添加到许多导航栏。这样做,它仅在最后一个导航栏上可见。
但是,如果我使用简单 UIBarButtonItem 的相同实例(没有自定义视图),它会显示在每个导航栏上。知道为什么吗?

【问题讨论】:

  • 我只是按照你的建议做了,但没有改变任何东西。 UIButton 已经是 UIView 的子类,所以我不明白你的意思。
  • 你把代码放在哪里了?
  • 什么是 viewController ?
  • 您的代码在我这边完美运行,“邀请”标题显示不正确(因为它的长度),但按钮在那里。我在模拟器和 iPhone 5 上运行它。你可能没有在正确的地方使用。

标签: ios objective-c iphone uibutton uibarbuttonitem


【解决方案1】:

您的代码很好,只需更改此行:

    viewController.navigationItem.rightBarButtonItem = inviteButtonContainer;

    self.navigationItem.rightBarButtonItem = inviteButtonContainer;

来自文档:

用于表示视图控制器的导航项 父母的导航栏。

self本身就表示属于view controller,所以添加导航项就不用再提view controller实例了。

【讨论】:

    【解决方案2】:

    -> 在创建自定义栏按钮的视图控制器中显示自定义按钮(即在自身中):

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [inviteButton setTitle:@"Invite" forState:UIControlStateNormal];
        inviteButton.frame = CGRectMake(0, 0, 70, 30);
        inviteButton.backgroundColor = [UIColor redColor];
        inviteButton.layer.borderColor = [UIColor blueColor].CGColor;
        inviteButton.layer.borderWidth = 1.0f;
    
        UIBarButtonItem *inviteButtonContainer = [[UIBarButtonItem alloc] initWithCustomView:inviteButton];
    
        controller.navigationItem.rightBarButtonItem = inviteButtonContainer;
    }
    

    -> 在即将呈现的视图控制器中显示自定义条形按钮

    例如。在表格视图中选择单元格后显示视图控制器

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        DjDetailsViewController *controller = (DjDetailsViewController *) 
        [self.storyboard instantiateViewControllerWithIdentifier:@"DjDetailsViewController"];
    
        UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [inviteButton setTitle:@"Invite" forState:UIControlStateNormal];
        inviteButton.frame = CGRectMake(0, 0, 70, 30);
        inviteButton.backgroundColor = [UIColor redColor];
        inviteButton.layer.borderColor = [UIColor blueColor].CGColor;
        inviteButton.layer.borderWidth = 1.0f;
    
        UIBarButtonItem *inviteButtonContainer = [[UIBarButtonItem alloc] initWithCustomView:inviteButton];
    
        controller.navigationItem.rightBarButtonItem = inviteButtonContainer;
        [self.navigationController pushViewController:controller animated:YES];
    }
    

    我没学过专业。我刚刚使用了您的代码并更改了自定义栏按钮的框架。 我希望这能帮到您。

    【讨论】:

      【解决方案3】:

      您的问题在于您的邀请按钮初始化程序:

      UIButton *inviteButton = [UIButton UIButtonTypeCustom];
      

      UIButtonTypeCustom 是枚举值而不是类方法/便利构造函数。

      使用

      UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeCustom];
      

      希望对你有帮助

      【讨论】:

      • 抱歉,写这个问题时打错了。无论如何,我不可能遵守这样的代码。我编辑了我的问题。
      • 可能是你的inviteButton上的框架有误(文本太小)。设置文本后尝试调用[inviteButton sizeToFit];。也看看使用buttonWithType:UIButtonTypeRoundedRect时是否有效
      猜你喜欢
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多