можно изменить цвета заголовка TTTableMessageItem (Three20)? - PullRequest
0 голосов
/ 06 марта 2011

Когда я создаю экземпляр TTTableMessageItem, я могу получить доступ только к imageURL, заголовку, заголовку и т. Д. Можно изменить цвета заголовка TTTableMessageItem (Three20)?

1 Ответ

1 голос
/ 06 марта 2011

Да, хотя требуется немного работы (и, к сожалению, также требуется некоторый опыт работы с Three20, чтобы понять это).

Сначала фон:

Когда вы создаете TTTableMessageItem, Three20 позже создаст ячейку таблицы типа TTTableMessageItemCell. (См. Код в -[TTTableMessageDataSource tableView:cellClassForObject:] в проекте Three20UI.)

Итак, если вы посмотрите на исходный код класса TTTableMessageItemCell (также в том же проекте), вы увидите, что у него есть свойство с именем titleLabel. В функции - (UILabel*)titleLabel, которая создает эту метку, она устанавливает _titleLabel.textColor = [UIColor blackColor].

Таким образом, это дает нам информацию, которая нам необходима, чтобы выяснить, как изменить цвет заголовка: вам нужно найти способ изменить свойство titleLabel.textColor экземпляра TTTableMessageItemCell. Есть несколько подходов, которые вы можете использовать.

Способ, который проще, но, возможно, не настолько чист (но на самом деле не так уж плох), состоит в том, чтобы создать собственный класс делегата таблицы - подкласс TTTableViewVarHeightDelegate - и затем реализовать -[tableView:willDisplayCell:forRowAtIndexPath:] в своем подклассе. , В этой функции измените titleLabel's textColor. Чтобы принять этот подход:

  • Создайте свой собственный класс делегата табличного представления - подкласс TTTableViewVarHeightDelegate. Например, вот MyDelegate.h:

    @interface MyDelegate : TTTableViewVarHeightDelegate
    @end
    

    А вот и MyDelegate.m:

    @implementation MyDelegate
    
    - (void)tableView:(UITableView *)tableView
              willDisplayCell:(UITableViewCell *)cell
            forRowAtIndexPath:(NSIndexPath *)indexPath 
    {
        if ([cell isKindOfClass:[TTTableMessageItemCell class]]) {
            TTTableMessageItemCell* messageCell = (TTTableMessageItemCell*)cell;
            messageCell.titleLabel.textColor = [UIColor blueColor];
        }
    }
    
    @end
    
  • В контроллере табличного представления (ваш подкласс TTTableViewController) переопределите createDelegate:

    - (id <UITableViewDelegate>) createDelegate {
        return [[[MyDelegate alloc] initWithController:self] autorelease];
    }
    

Другой подход, который, возможно, немного чище, но требует больше работы, заключается в создании подклассов TTTableMessageItem и TTTableMessageItemCell; в подклассе TTTableMessageItemCell измените цвет заголовка (например, переопределив -[titleLabel]); затем подкласс TTListDataSource или TTSectionedDataSource; в подклассе переопределить -[tableView:cellClassForObject:]; и когда вам передают экземпляр вашего TTTableMessageItem подкласса, возвращают экземпляр вашего TTTableMessageItemCell подкласса. Уф! Это дает вам повторное использование кода: Любая таблица может возвратить экземпляр вашего подкласса TTTableMessageItem и получить заголовок соответствующего цвета, а не описанную выше технику, которая является чем-то вроде хака, потому что она помещает ячейку Знание цвета в делегате табличного представления, который не совсем подходит для этого. Но, как вы видите, для чего-то простого, например, просто поменять цвет, нужно пройти через много обручей.

...