在哪里设置NavigationController.NavigationBar.isUserInteractionEnabled

ios objective-c uinavigationcontroller uinavigationbar

357 观看

1回复

15 作者的声誉

我有一个关于将navigationBar.isUserInteractionEnabled设置为false的问题。我在viewDidLoad和viewDidLayoutSubviews中进行设置。但是此设置不起作用,因为即使我设置为false,该值也为true。仅在返回上一个视图时(单击backButton然后应将navigationBar.isUserInteraction设置为false时),才需要将其设置为false。我该怎么做?还有其他代表吗?或者我需要在调用viewDidLoad之后设置计时器。 这是一张图片,以明确我的意思

作者: StxApp 的来源 发布者: 2017 年 9 月 15 日

回应 1


1

12867 作者的声誉

决定

如果您出于某些特定原因专门禁用导航栏的userInteraction,可以通过调用

斯威夫特:

self.navigationController?.navigationBar.isUserInteractionEnabled = false

目标C:

[self.navigationController.navigationBar setUserInteractionEnabled:false];

编辑2:

仅在返回上一个视图时才需要将其设置为false(单击backButton然后应将navigationBar.isUserInteraction设置为false时)

您不能在viewController的viewWillDisappear中禁用导航栏用户交互,因为如果在调用viewWillDisappear的时间点点击了backButton,则会从导航堆栈中删除ViewController。

因此,当您调用self.navigationController时,导航控制器为nil。

最简单的解决方案是,在实际弹出VC之前,添加您自己的后退按钮并禁用导航栏的用户交互。

在您的第二个VC中

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];

    self.navigationItem.leftBarButtonItem = backButton;
    // Do any additional setup after loading the view from its nib.
}

-(void)handleBack {
    [self.navigationController.navigationBar setUserInteractionEnabled:false];
    [self.navigationController popViewControllerAnimated:true];
}

那会做的

编辑3:

您需要设置导航栏的用户交互,通过禁用左右栏按钮项的用户交互,可以达到相同的效果

    for item in self.navigationItem.leftBarButtonItems! {
        item.isEnabled = false
    }

    for item in self.navigationItem.rightBarButtonItems! {
        item.isEnabled = false
    }

您可以根据自己的逻辑在viewDidLoad,viewWillAppear或适合您代码的任何位置启用和禁用它们。

目标C

for(UIBarButtonItem *item in self.navigationItem.leftBarButtonItems) {
    [item setEnabled:false];
}

for(UIBarButtonItem *item in self.navigationItem. rightBarButtonItems) {
    [item setEnabled:false];
}
作者: Sandeep Bhandari 发布者: 2017 年 9 月 15 日
32x32