重新加载导航栏 UIBarButtonItem

Reload navigationBar UIBarButtonItems

我一直在尝试解决这个问题,但我不知道如何解决。

我有一个 UIButton,我需要添加一个 UILabel 作为子视图。

我需要更新此 UIButton,因为在通过 NSNotification 调用方法之前我没有所需的号码。

问题是,使用此代码 UIBarButtonItem 更改时间太长,如果 UITableView 滚动(导航栏消失),两个按钮都会消失(即使导航栏重新出现)。

- (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];
}

对我来说,有两种可能的解决方案:要么立即更新(会更好),要么让按钮在滚动时不会消失

如果您想重新加载标签文本或 table 视图,请在 Main 线程上进行。

通知在主线程以外的线程上工作,除非指定。

这样做:

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