Как программно заменить объекты UIToolBar, созданные в IB

Я не верю, что это возможно - нет возможности установить часовой пояс для объекта Date после его создания.

И в некотором смысле это имеет смысл - концептуально (если, возможно, не в реализации); за http://en.wikipedia.org/wiki/Unix_timestamp (выделение мое):

Время Unix, или время POSIX, представляет собой систему для описания моментов во времени, определяется как количество секунд, прошедших с полуночи Всемирное координированное время (UTC) четверга, 1 января 1970 года.

После того, как вы его построите, он будет представлять определенную точку в «реальном» времени. Часовой пояс имеет значение только тогда, когда вы хотите преобразовать этот абстрактный момент времени в удобочитаемую строку.

Таким образом, имеет смысл, что вы сможете изменить только фактическое время, которое Date представляет в конструкторе. К сожалению, кажется, что нет никакого способа передать в явном часовом поясе - и конструктор, который вы вызываете (возможно, правильно), переводит ваши «локальные» переменные времени в GMT, когда он канонически сохраняет их - поэтому нет способа использовать int, int, int конструктор для времени по Гринвичу.

С другой стороны, тривиально просто использовать конструктор, который принимает строку. Вам даже не нужно конвертировать числовой месяц в строку (по крайней мере, в Firefox), поэтому я надеялся, что наивная реализация сработает. Тем не менее, после его тестирования он успешно работает в Firefox, Chrome и Opera, но не работает в Konqueror («Неверная дата»), Safari («Неверная дата») и IE («NaN»). Я полагаю, у вас просто есть массив поиска для преобразования месяца в строку, например:

var months = [ '', 'January', 'February', ..., 'December'];

function createGMTDate(xiYear, xiMonth, xiDate) {
   return new Date(months[xiMonth] + ' ' + xiDate + ', ' + xiYear + ' 00:00:00 GMT');
}

12
задан frankodwyer 3 July 2009 в 09:34
поделиться

5 ответов

Вот пример того, что я сделал в похожей ситуации. Я хотел создать панель инструментов с помощью Interface Builder, но переключать один из BarButtonItems в зависимости от того, был ли он «отмечен». В этом примере следует отметить несколько ключевых моментов. Следующие 2 переменные-члены определены для класса в файле заголовка:

NSMutableArray *toolbarItems;
IBOutlet UIToolbar *toolbar;
NSUInteger checkUncheckIndex;

Когда я хочу обновить проверенный статус, я вызываю эту функцию ... Обратите внимание, что существует определенный селектор с именем checkUncheckClicked, который вызывается, когда конкретный нажата кнопка в UIToolbar. А UIToolbar настроен как IBOutlet для панели инструментов. В качестве альтернативы вы можете подключить UIBarButtonItem как выход и использовать его как свою логику для определения индекса кнопки, или, если на то пошло, вы можете жестко запрограммировать индекс кнопки, если что-то выиграет ' t меняются со временем. Наконец, есть checked.png и unchecked.png, которые можно переключать между включенными в проект.

- (void)updateBarButtonItemChecked:(BOOL)checked {
    if (toolbarItems == nil) {
        toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain];
        checkUncheckIndex = -1;

        for (NSUInteger i = 0; i < [toolbarItems count]; i++) {
            UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i];
            if (barButtonItem.action == @selector(checkUncheckClicked)) {
                favoriteIndex = i;
                break;
            }
        }
    }

    if (checkUncheckIndex != -1) {
        UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                                                                           style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease];
        [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem];

        toolbar.items = toolbarItems;
    }
}

И, конечно, toolbarItems и toolbar должны быть освобождены в вашем освобождении для класса.

Надеюсь, это поможет!

26
ответ дан 2 December 2019 в 04:34
поделиться

Попробуйте:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb {
    NSMutableArray *newItems = [tb.items mutableCopy];
    UIBarButtonItem *old = [newItems objectAtIndex:1],
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action];

    [newItems  replaceObjectAtIndex:1 withObject:titled];
    tb.items = newItems;

    [titled release];
}
0
ответ дан 2 December 2019 в 04:34
поделиться

Думаю, это должно быть возможно. Вы можете попробовать создать IBOutlet для этой конкретной кнопки в своем классе ViewController и подключить кнопку из IB к этому выходу, или вы можете использовать свойство items этого экземпляра UIToolbar (у вас есть ссылка на это, не так ли? ?) и найдите там соответствующий элемент, создайте новый массив NSArray с измененными элементами и установите его обратно в свойство toolbar.items.

HTH

1
ответ дан 2 December 2019 в 04:34
поделиться

Вот подход, который я использовал Казалось бы, гораздо проще управлять панелью инструментов полностью программно, так что ....

В вашем контроллере представления объявляется 1 или несколько наборов элементов UIBarButtonItem как элементы свойств, а также объявляется и подключается панель инструментов как свойство UIToolbar. Также объявите 1 или несколько массивов для хранения элементов.

В реализации В viewDidLoad выделите и установите ваши UIBarButtonItems, например

       playButton = [[UIBarButtonItem alloc]
         initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)];

Гибкие кнопки (для выравнивания и т.д.) объявлены следующим образом

   flexButton1 =[[UIBarButtonItem alloc]
 initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil];

Существует несколько методов initMethods для обработки различных типов кнопок, поддерживаемых панелями инструментов. Все следуют синтаксису, аналогичному приведенному выше. Обращает на себя внимание цель и настройки действий. Target: обычно будет self, действие - это имя функции, которую должна запускать кнопка.

После выделения ваших UIBarButton добавьте их в массив с помощью initWithObjects.

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

[toolbar setItems:<array name>];

Не забудьте освободить UIBarButton и массивы в конце кода.

Надеюсь, это поможет. Если вам нужно больше кода, дайте мне знать.

Рич Д.

2
ответ дан 2 December 2019 в 04:34
поделиться

Примечание - панель инструментов удалит любой цвет из ваших значков, так что вы все равно не сможете сделать его желтым. Вам нужно будет изменить форму изображения, чтобы указать "на" вместо этого.

В качестве альтернативы вам нужно загрузить свои панели кнопок с UIButtonItems (используйте initWithCustomView) и установить изображение кнопки соответствующим образом.

HTH

0
ответ дан 2 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: