Показаны сообщения с ярлыком objective-c. Показать все сообщения
Показаны сообщения с ярлыком objective-c. Показать все сообщения

суббота, 31 марта 2012 г.

Доступные шрифты в iphone sdk

Данный вопрос почему-то слабо освещен в документации Apple, но всегда есть выход.
Вот код, который напечатает в dbg-console все доступные шрифты:

    // List all fonts on iPhone
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSArray *fontNames;
    NSInteger indFamily, indFont;
    for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
    {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
        fontNames = [[NSArray alloc] initWithArray:
                     [UIFont fontNamesForFamilyName:
                      [familyNames objectAtIndex:indFamily]]];
        for (indFont=0; indFont<[fontNames count]; ++indFont)
        {
            NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
        [fontNames release];
    }
    [familyNames release];

А вот вывод в XCode 4 IPhone SDK 5.0:

Редактируем шрифт, его цвет и прочие прибамбасы в TabBar

for (UIViewController *tab in rootController.viewControllers)
    {
      [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor blackColor], UITextAttributeTextColor,
         [NSValue valueWithUIOffset:UIOffsetMake(0,0)], UITextAttributeTextShadowOffset,
        [UIFont fontWithName:@"Noteworthy-Light" size:13.0], UITextAttributeFont, nil]
          forState:UIControlStateNormal];
     //
    [tab.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor whiteColor], UITextAttributeTextColor, nil]
          forState:UIControlStateSelected];
    }

Еще раз о работе с памятью в Obj-C


Дело обстоит так:

когда создаешь получаешь объект статическим методом вроде stringWithString, то созданный объект попадает в autorelease pool и его счетчик ссылок обнуляется, когда уничтожается этот пул. Однако система может и сама заретайнить некоторые объекты из пула, когда ей не хватает памяти.

Общее правило таково:

Когда ты создаешь получаешь объект методами, в названии которых есть слова alloc, copy, new и retain, то ТЫ СТАНОВИШЬСЯ ВЛАДЕЛЬЦЕМ ОБЪЕКТА И ТЫ ОТВЕЧАЕШЬ ЗА НЕГО И СВОЕВРЕМЕННЫЙ release. Во всех других случаях, ты не являешься владельцем объекта и не вправе контролировать его retainCount - т.е. делать release.

Хочу заметить, что на один alloc, copy, retain должен приходиться один release! То есть не стоит делать несколько раз release, если retain ты сделал всего один раз. ;)

воскресенье, 21 августа 2011 г.

UITextField: делаем, что надо и прячем клавиатуру


Контроллер, в котором вы хотите обрабатывать события UITextField должен поддерживать протокол <UITextFieldDelegate>
Например, у меня есть View, в котором есть UITableView и UITextField. И я в одном контроллере хочу обрабатывать поведение и того и другого. Тогда этот контроллер должен поддерживать соответствующие протоколы.

// AccountOptionsController.h
@interface AccountOptionsController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>

Чтобы спрятать клавиатуру после окончания ввода данных и нажатия кнопки Return, нужно переопределить метод textFieldShouldReturn. Напиример так:

// AccountOptionsController.m
 
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Чтобы обработать введенные данные, нужно переопределить метод textFieldDidEndEditing.

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    if (textField == loginField)
    {
        userData.login = textField.text;
    }
    ...
}

Думаю, общая идея ясна, а для дополнительных сведений смотри UITextFieldDelegate Protocol Reference.
С UITableView то же самое. Смотри UITableViewDelegate Protocol Reference и UITableViewDataSource Protocol Reference.