Как программно добавить UIButton в UIToolBar? - PullRequest
5 голосов
/ 16 августа 2011

Я добавил панель инструментов с помощью 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 ]

8 голосов
/ 16 августа 2011

Если вы действительно хотите добавить 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];

Затем добавьте элемент на панель инструментов, как указано выше.


Что касается того, почему ваши кнопки не отображаются в опубликованном коде, проблема в том, что buttonWithType: UIButton создает кнопку с нулевой шириной и нулевой высотой. Вам нужно изменить размер кнопки (вручную или с помощью sizeToFit после установки заголовка), чтобы она отображалась. После исправления вы увидите, что все кнопки расположены друг над другом в верхнем левом углу родительского представления; вам необходимо расположить их вручную, в зависимости от ситуации.

1 голос
/ 23 ноября 2012

Подход панели инструментов

Одна проблема с добавлением UIButton к UIToolBar состоит в том, что ширину кнопки и ее расположение трудно контролировать

Более простой подход

Снимите панель инструментов и поместите UIView с фоновым изображением, идентичным вашей панели инструментов. Теперь вы можете добавить UIButton как подпредставление к этому представлению. Таким образом, вы сможете лучше контролировать положение и ширину кнопок. Также вы можете добавить другие виды.

1 голос
/ 04 октября 2012

Я не думаю, что вы можете изменить navigationController прямо в своем коде таким образом.

Безопаснее было бы это:

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