代码之家  ›  专栏  ›  技术社区  ›  vikingosegundo

ttLauncherItem:立即更改徽章(或:如何刷新ttLauncherView)

  •  2
  • vikingosegundo  · 技术社区  · 14 年前

    我有一个 TTLauncherView 与一些 TTLauncherItems . 这些显示徽章,表示来自网络的消息。我把徽章放进去了 viewWillAppear: 如果我切换到另一个视图,然后返回,将显示正确的徽章。但我想在收到消息后立即更新徽章。

    打电话 setNeedsDisplay 在ttLauncherView上没有帮助?

    我如何刷新 TTD ?

    在我的MessageReceiver类中,我执行以下操作:

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

    我的ttviewcontroller派生的概述controller

    @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 回复  |  直到 14 年前
        1
  •  1
  •   vikingosegundo    14 年前

    我自己找到了解决办法。

    我在AppDelegate的LauncherView中注册控制器。在我的信息课上,我打电话 [appDelegate reloadLauncherView]; 这又称之为

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

    在包含启动器视图的控制器上。

        2
  •  0
  •   livingtech    13 年前

    我今天遇到了一个非常类似的问题(修改了一个ttlauncheitem,没有直接看到我的更改),并且通过调用 [myLauncherView layoutSubviews]; 在我修改TTLauncherItem之前。我实际上在代码中跟踪了它,这是因为layoutSubview将重新创建LauncherView的 _buttons 数组(在我的例子中,这是需要发生的事情)。

    希望这对以后有帮助!