【问题标题】:TTLauncherItem: change badge immediately (or: how to refresh TTLauncherView)TTLauncherItem:立即更改徽章(或:如何刷新 TTLauncherView)
【发布时间】:2010-06-08 16:05:26
【问题描述】:

我有一个TTLauncherView 和一些TTLauncherItems。这些显示徽章,代表来自网络的消息。我在viewWillAppear: 中设置了徽章,因此如果我切换到另一个视图然后返回,则会显示正确的徽章。但我想在收到消息后立即更新徽章。

在 TTLauncherView 上调用 setNeedsDisplay 没有帮助?

如何刷新TTLauncherView

在我的 MessageReceiver 类中,我这样做:

TTNavigator* navigator = [TTNavigator navigator];

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

我的 TTViewController 派生的 OverviewController

@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

【问题讨论】:

    标签: objective-c ios cocoa-touch three20


    【解决方案1】:

    我在 AppDelegate 的 LauncherView 中注册了我的 Controller。在我的消息传递类中,我调用[appDelegate reloadLauncherView];,它将再次调用它

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

    在包含 LauncherView 的 Controller 上。

    【讨论】:

    • 您能否提供一些此解决方案的示例代码?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2017-11-12
      相关资源
      最近更新 更多