TTLauncherItem: изменить значок сразу (или: как обновить TTLauncherView) - PullRequest
2 голосов
/ 08 июня 2010

У меня есть TTLauncherView с некоторыми TTLauncherItems. Они показывают значки, представляющие сообщения из сети. Я установил значки в viewWillAppear:, поэтому, если я переключаюсь в другое представление, а затем возвращаюсь, отображаются правильные значки. Но я хочу обновить значки, как только придет сообщение.

Вызов setNeedsDisplay на TTLauncherView не помогает?

Как мне обновить TTLauncherView?

в моем классе MessageReceiver я делаю это:

TTNavigator* navigator = [TTNavigator navigator];

            [(OverviewController *)[navigator viewControllerForURL:@"tt://launcher"] reloadLauncherView] ;

MyController, производный от TTViewController

@implementation OverviewController


- (id)init {
  if (self = [super init]) {
    self.title = OverviewTitle;
  }
  return self;
}

- (void)dealloc {
    [items release];
    [overView release];
    [super dealloc];
}


-(void)viewDidLoad
{
    [super viewDidLoad];

    overView = [[TTLauncherView alloc] initWithFrame:self.view.bounds];
    overView.backgroundColor = [UIColor whiteColor];
    overView.delegate = self;
    overView.columnCount = 4;

    items = [[NSMutableArray alloc] init];
    for(int i = 1; i <= NumberOfBars; ++i){
        NSString *barID = [NSString stringWithFormat:NameFormat, IDPrefix, i];
        TTLauncherItem *item = [[[TTLauncherItem alloc] initWithTitle:barID
                                                                image:LogoPath
                                                                  URL:[NSString stringWithFormat:@"tt://item/%d", i]
                                                            canDelete:NO] autorelease];
        [barItems addObject: item];


    }
    overView.pages = [NSArray arrayWithObject:items];
    [self.view addSubview:overView];

}

-(void)viewWillAppear:(BOOL)animated
{


    for(int i = 0; i <[barItems count]; i++){
        TTLauncherItem *item = [items objectAtIndex:i];
        NSString *barID = [NSString stringWithFormat:NameFormat, IDPrefix, i+1];
        P1LOrderDispatcher *dispatcher = [OrderDispatcher sharedInstance];
        P1LBarInbox *barInbox = [dispatcher.barInboxMap objectForKey:barID];
        item.badgeNumber = [[barInbox ordersWithState:OrderState_New]count];
    }
    [super viewWillAppear:animated];
}


- (void)launcherView:(TTLauncherView*)launcher didSelectItem:(TTLauncherItem*)item 
{
    TTDPRINT(@"%@", item);
    TTNavigator *navigator = [TTNavigator navigator];
    [navigator openURLAction:[TTURLAction actionWithURLPath:item.URL]];
}

-(void)reloadLauncherView
{

    [overView setNeedsDisplay];//This doesn't work
}
@end

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Я регистрирую свой Контроллер в LauncherView в AppDelegate.В моем классе обмена сообщениями я вызываю [appDelegate reloadLauncherView];, который снова вызовет это

-(void)reloadLauncherView
{
    [self viewWillAppear:NO ];
}

на контроллере, который содержит LauncherView.

0 голосов
/ 30 августа 2011

У меня была очень похожая проблема сегодня (изменение TTLauncherItem, и я не видела мои изменения напрямую), и я смог решить ее, позвонив [myLauncherView layoutSubviews]; ДО того, как я изменил TTLauncherItem. Я фактически отследил это в коде, и это было потому, что layoutSubviews воссоздает массив _buttons LauncherView (что и должно было произойти, в моем случае).

...