2015-05-19 55 views
1

我一直在試圖解決這個問題,但我無法弄清楚如何。重新加載導航欄UIBarButtonItems

我有一個UIButton我需要添加一個UILabel作爲子視圖。

我需要更新此UIButton,因爲我沒有所需的數字,直到通過NSNotification調用方法。

問題是,使用此代碼UIBarButtonItem需要很長時間才能更改,並且如果滾動UITableView(navBar消失),則兩個按鈕消失(即使導航欄再次出現)。

- (void) addSettingsButton { 
    self.navigationItem.rightBarButtonItems = nil; 

    UIButton * button2 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    button2.frame = CGRectMake(0, 0, 19, 19); 
    [button2 setImage:[UIImage imageNamed:@"settingsBtn.png"] forState:UIControlStateNormal]; 
    button2.tintColor = [UIColor grayColor]; 
    [button2 addTarget:self action:@selector(showSettings) forControlEvents:UIControlEventTouchUpInside]; 
    //self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button2]; 
    UIBarButtonItem* button2Aux = [[UIBarButtonItem alloc] initWithCustomView:button2]; 

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 19, 19)]; 

    UIButton * button3 = [UIButton buttonWithType:UIButtonTypeSystem]; 
    button3.frame = CGRectMake(0, 4, 23, 15.5); 

    int altoPantalla = [UIScreen mainScreen].bounds.size.height; 

    [button3 setBackgroundImage:[UIImage imageNamed:[NSString stringWithFormat:@"Icon_Buzon.png"]] forState:UIControlStateNormal]; 

    [button3 addTarget:self action:@selector(showTut) forControlEvents:UIControlEventTouchUpInside]; 

    [view addSubview:button3]; 

    NSString *cantNotificaciones = self.cantNotificaciones; 
    NSInteger posX = 0, posY = 0, ancho = 0, alto = 0, radio; 
    BOOL ponerCirculo = NO; 

    if (cantNotificaciones.length >= 3) { 

     cantNotificaciones = @"+99"; 
     posX = 10.5; 
     posY = 12; 
     ancho = 21; 
     alto = 15; 
     radio = 8; 
     ponerCirculo = YES; 

    } else if (cantNotificaciones.length == 2 || (cantNotificaciones.length == 1 && ![cantNotificaciones isEqualToString:@"0"])) { 

     posX = 8; 
     posY = 12; 
     ancho = 16; 
     alto = 16; 
     radio = 8; 

     ponerCirculo = YES; 
    } else { 
     ponerCirculo = NO; 
    } 

    if (ponerCirculo) { 

     UILabel *lbl3 = [[UILabel alloc] initWithFrame:CGRectMake(button3.center.x-posX, -posY, ancho, alto)]; 
     [lbl3 setText:cantNotificaciones]; 
     lbl3.textColor = [UIColor whiteColor]; 
     lbl3.backgroundColor = [UIColor redColor]; 
     [lbl3 setFont:[UIFont systemFontOfSize:10]]; 
     lbl3.layer.cornerRadius = radio; 
     lbl3.clipsToBounds = YES; 
     [lbl3 setTextAlignment:NSTextAlignmentCenter]; 
     [button3 addSubview:lbl3]; 

    } else { 

    } 

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showTut)]; 
    [tap setNumberOfTouchesRequired:1]; 
    [tap setNumberOfTapsRequired:1]; 
    [view addGestureRecognizer:tap]; 

    UIBarButtonItem* button3Aux = [[UIBarButtonItem alloc] initWithCustomView:view]; 

    switch (altoPantalla) { 
     case 480: 
      posicionX = -7; 
      space = 21; 
      break; 
     case 568: 
      posicionX = -10; 
      space = 21; 
      break; 
     case 667: 
      posicionX = 19; 
      space = 27; 
      break; 
     case 736: 
      posicionX = 19; 
      space = 40; 
      break; 
     default: 
      break; 
    } 

    UIBarButtonItem *positiveSpacer = [[UIBarButtonItem alloc] 
            initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
            target:nil action:nil]; 
    positiveSpacer.width = space; 

    self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects:button2Aux, positiveSpacer, button3Aux, nil]; 
    [self.view setNeedsLayout]; 
    [self.view setNeedsDisplay]; 
} 

-(void) modificarNumeroBoton:(NSNotification *) notification 
{ 
    NSString *cantidad = (NSString *)[notification object]; 
    NSLog(@"Numero recibido: %@",cantidad); 

    self.cantNotificaciones = cantidad; 
    [self addSettingsButton]; 
} 

對我來說,有兩種可能的解決方案:要麼進行更新立即(效果會更好),或使它這樣的按鈕不能滾動

回答

0

時,如果你想重新加載標籤文本消失或表格視圖然後在Main線程上執行。

除非指定,否則通知在除main之外的其他線程上工作。

這樣做:

dispatch_async(dispatch_get_main_queue(), ^(void){ 
     //Update the label text 
     // Update the Tableview 
}); 
+0

謝謝,我是新來的Objective-C,我應該在哪裏放呢? –

+0

我已經意識到了,謝謝! –

+0

太棒了!歡迎:) –