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

6
我使用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];  
}
3个回答

9

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

    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)才能显示出来。在修复这个问题之后,您会发现所有的按钮都堆叠在父视图的左上角;您需要手动适当地定位它们。


这就很合理了,为什么没有显示图像。感谢您提供更好的替代方案并触及这一点。 - iamtoc

1

我认为你不能直接在代码中更改navigationController

更安全的方法是这样的:

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

1

工具栏方法

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

更简单的方法

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接