如何以编程方式将 UIButton 添加到 UIToolBar?

Posted

技术标签:

【中文标题】如何以编程方式将 UIButton 添加到 UIToolBar?【英文标题】:How does one add UIButton to UIToolBar programmatically? 【发布时间】:2011-08-16 16:03:26 【问题描述】:

我已经使用 Interface Builder 添加了工具栏,但我需要在运行时/有条件地添加按钮。我没有收到任何错误,但我的动态按钮没有出现在工具栏上。我已经验证了 arrayOfModulesScreens 加载了我需要的数据。至少有效(:))。我是否需要将按钮添加到 UIView,然后将该视图添加到工具栏?只是大声思考。也许有更好的方法开始?提前感谢您提供解决问题的任何线索。

CustomFormController.h

@interface CustomFormController : UIViewController  
    UIToolbar *screensBar;  

CustomFormController.m

EPData *epData = [[EPData alloc] init];
NSArray *screens = [epData loadPlistIntoArray:@"Screens"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"process_module_id == %@", process_modulesID];
NSArray *arrayOfModulesScreens = [screens filteredArrayUsingPredicate:predicate];

for(int i=0; i < [arrayOfModulesScreens count]; i++) 
    NSDictionary *dictRow = [arrayOfModulesScreens objectAtIndex:i];
    UIButton *button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
    [button setTitle:[dictRow objectForKey:@"screen_title"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [screensBar addSubview:button];  

【问题讨论】:

【参考方案1】:

如果你真的想在工具栏中添加一个 UIBarButtonItem(不是 UIButton),你只需创建一个或多个 UIBarButtonItem,将它们放在一个 NSArray(或 NSMutableArray)中,然后将该数组分配给 items 的属性工具栏。有关详细信息,请参阅the UIBarButtonItem documentation。使用上面的代码,可能看起来像这样:

    NSMutableArray *items = [NSMutableArray array];
    for (int i = 0; i < [arrayOfModulesScreens count]; i++) 
        NSDictionary *dictRow = [arrayOfModulesScreens objectAtIndex:i];
        UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:[dictRow objectForKey:@"screen_title"]
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(buttonClick:)];
        [items addObject:button];
        [button release];
    
    screensBar.items = items;

(当然,您需要更改您的 buttonClick: 以期望 UIBarButtonItem 而不是 UIButton)。

如果你真的想在其中放置一个 UIButton,你首先需要将 UIButton 包装在一个 UIBarButtonItem 中,如下所示:

UIBarButtonItem *item = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];

然后像上面一样将项目添加到工具栏。


至于为什么您的按钮没有显示在您发布的代码中,问题在于 UIButton 的buttonWithType: 创建了一个宽度为零、高度为零的按钮。您需要调整按钮的大小(手动或在设置标题后使用sizeToFit)以使其显示。修复后,您会看到按钮都在父视图的左上角彼此重叠;您需要根据需要手动定位它们。

【讨论】:

这完全可以解释为什么没有图像显示。感谢您谈到这一点并提供更好的选择。【参考方案2】:

我认为您不能像那样直接在代码中更改navigationController

更安全的方法是:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:[dictRow objectForKey:@"screen_title"]
                                                           style:UIBarButtonItemStyleBordered
                                                          target:self
                                                          action:@selector(buttonClick:)];
self.navigationItem.rightBarButtonItem = button;

【讨论】:

【参考方案3】:

工具栏方法

UIButton添加到UIToolBar的一个问题是按钮的宽度和按钮的位置难以控制

更简单的方法

删除工具栏并放置一个UIView,其背景图像与您的工具栏相同。现在您可以将UIButton 作为子视图添加到该视图。这样您就可以更好地控制按钮的位置和宽度。您也可以添加其他视图。

【讨论】:

以上是关于如何以编程方式将 UIButton 添加到 UIToolBar?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 IBAction 添加到 UIButton

以编程方式将 UIButton 添加到 UITableView 错误点

以编程方式将 UIButton 添加到 rootview,我做错了啥?

以编程方式将 UIButton 添加到 UITableView 但按钮不显示

如何以面向协议的方式快速将图层添加到 UIButton 子类?

如何以编程方式为 UIButton 添加系统图标?