【问题标题】:How to detect if a UIViewController has a back button如何检测 UIViewController 是否有后退按钮
【发布时间】:2012-12-10 13:10:19
【问题描述】:

我有一个扩展 UIViewController 功能的类别,它将自己的字幕添加到标题栏。它需要知道标题栏中存在哪些按钮,以便可以调整其中的标签大小。我可以检测是否有 leftBarButtonItem 和 rightBarButtonItem,但是当涉及到 backBarButtonItem 时,我尝试过的所有内容都告诉我没有后退按钮,而实际上在加载视图时有一个后退按钮。这是我用来测试的:

if(self.parentViewController.navigationItem.backBarButtonItem == nil){
    NSLog(@"no back button");
}
else {
    NSLog(@"has back button");
}

if(self.parentViewController.navigationController.navigationItem.backBarButtonItem == nil){
    NSLog(@"1no back button");
}
else {
    NSLog(@"1has back button");
}

if(self.navigationItem.backBarButtonItem == nil){
    NSLog(@"2no back button");
}
else {
    NSLog(@"2has back button");
}

if(self.navigationController.navigationItem.backBarButtonItem == nil){
    NSLog(@"3no back button");
}
else {
    NSLog(@"3has back button");
}

if(self.presentingViewController.navigationItem.backBarButtonItem == nil){
    NSLog(@"4no back button");
}
else {
    NSLog(@"4has back button");
}

if(self.presentingViewController.navigationController.navigationItem.backBarButtonItem == nil){
    NSLog(@"5no back button");
}
else {
    NSLog(@"5has back button");
}

if(self.presentedViewController.navigationItem.backBarButtonItem == nil){
    NSLog(@"6no back button");
}
else {
    NSLog(@"6has back button");
}

if(self.presentedViewController.navigationController.navigationItem.backBarButtonItem == nil){
    NSLog(@"7no back button");
}
else {
    NSLog(@"7has back button");
}

我试过把它放在 viewDidLoad、viewWillAppear 和 viewDidAppear 中,它们都返回没有返回按钮。在前一个视图中,我确实使用self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil]; 手动设置了后退按钮(后退按钮必须说后退而不是前一个视图的标题)。从逻辑上对我来说,这意味着 self.parentViewController 应该告诉我这个视图上是否有后退按钮,但显然没有。

【问题讨论】:

  • 您能检查子视图中是否有带有“返回”字样的按钮吗?
  • @propstm 也许可以,但我想尽可能保持通用,后退按钮可能没有返回这个词
  • 我曾经有一个类似的问题,但措辞略有不同。但是,答案对我很有帮助。也可能对你有所帮助。 stackoverflow.com/questions/8235261/… 但是,没有一个解决方案会真正检查 UI 项本身。

标签: objective-c ios


【解决方案1】:

如果当前情况属实,并且您希望后退按钮说“后退”,您可以遍历子视图来寻找该按钮。

BOOL exists = NO;
for (UIView *view in [self.view subviews]) {
    if ([view isMemberOfClass [UIButton class]]) {
        if([view.title isEqualToString: @"Back"]){
                exists = YES;
        }
    }
}
if(!exists){
     //Add back button
}

【讨论】:

  • 如果迫在眉睫,这可能会奏效,但我想保持通用性,以便在后退按钮没有返回单词时。
  • 你可以登录 self.navigationController 或 self.presentedViewController.navigationController。我只是想确保我们没有遇到该值为 nil 的问题
  • 我只是把你的代码放进去,第二个场景对我有用。将使用屏幕截图编辑我的回复。
  • 好的,我刚刚记录了它们,self.navigationController 不是 nil,但 self.presentedViewController.navigationController 似乎是 nil
  • hmm 好的,这更近了一步,但问题是上一个视图设置了当前视图后退按钮(似乎没有任何其他方式工作,否则它仍然在后退按钮中显示标题的背面)所以你需要从以前的观点来测试它
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多