6

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

CustomFormController.h

@interface CustomFormController : UIViewController { 
    UIToolbar *screensBar;  
}

自定义表单控制器.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];  
}
4

3 回答 3

9

如果您确实想将 UIBarButtonItem(不是 UIButton)添加到工具栏,您只需创建一个或多个 UIBarButtonItem,将它们放入 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];

然后将项目添加到工具栏,如上。


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

于 2011-08-16T16:22:35.230 回答
1

工具栏方法

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

更简单的方法

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

于 2012-11-23T03:47:30.337 回答
1

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

更安全的方法是:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:[dictRow objectForKey:@"screen_title"]
                                                           style:UIBarButtonItemStyleBordered
                                                          target:self
                                                          action:@selector(buttonClick:)];
self.navigationItem.rightBarButtonItem = button;
于 2012-10-04T05:35:10.283 回答