【问题标题】:Replace navigation bar cancel button with back button用返回按钮替换导航栏取消按钮
【发布时间】:2013-10-05 19:08:31
【问题描述】:

我在导航控制器中嵌入了一个表格视图控制器。表格单元格都是静态的,选择其中任何一个都将转到另一个表格视图。当 segue 发生时,导航栏显示新视图的“取消”按钮,而不是“返回”按钮。

我可以在代码中添加一个后退按钮

- (void)viewDidLoad
{
    self.navigationItem.backBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                         style:UIBarButtonSystemItemCancel
                                        target:nil
                                        action:nil];
    self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;
}

但是后退按钮将是一个矩形,而不是左边缘有角度的默认后退按钮形状。如何简单地将取消按钮更改为系统返回按钮?

这是我从表格单元格转到下一个表格视图的代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    switch (indexPath.row) {
        case 0:
            [self performSegueWithIdentifier:@"goToSecondTable" sender:self.tableView];
            break;
        /* and perform segue for other rows */
        default:
            break;
    }
}

prepareForSegue 里面也没什么可做的。

这是连接检查器显示的内容

这是“条形按钮项 - 返回”的连接

【问题讨论】:

  • 你能发布你用来推送新视图的代码吗?还有,如果你在新控制器的加载方法中做了什么?
  • 添加了触发 segue 和加载视图的代码。谢谢!

标签: ios objective-c uinavigationcontroller uibarbuttonitem


【解决方案1】:

如果没有默认的后退按钮不起作用,请自定义代码

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:myBackImage style: UIBarButtonItemStylePlain target:self action:someAction];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

【讨论】:

    【解决方案2】:

    为什么你在 didselectrow 中执行 segue 而不是仅仅推送视图控制器?

    尝试 [self.navigationController pushViewController:YOURVIEWCONTROLLER];

    这将确保您有一个后退按钮。此外,您必须使用这样的 segue,确保您正在使用 push segue 到您的下一个控制器。看起来您在第二个 viewController 中创建了自己的后退按钮。您不需要创建一个,因为将使用前一个视图控制器的标题为您创建一个。您可以通过在推送之前更改上一个视图控制器中的 self.title = @"Back" 来确保它回复。

    代码:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        switch (indexPath.row) {
            case 0:
                self.title = @"Back";
                [self.navigationController pushViewController:SECONDVC];
                break;
            /* and perform segue for other rows */
            default:
                break;
        }
    }
    

    在viewWillAppear中:

     - (void)viewWillAppear:(BOOL)animated
    {
       [super viewWillAppear:animated];
       self.title = @"Whatever you want";
    }
    

    【讨论】:

    • 我想知道在什么情况下,默认情况下会出现取消按钮而不是返回按钮?我最终添加了一个“完成”按钮来“覆盖”取消按钮,几乎没有代码更改。谢谢!
    【解决方案3】:

    默认情况下,系统提供的后退按钮应该是左栏按钮项,无需执行任何操作(在代码中或在 IB 中)。

    在 Connections 检查器中删除与 backBarButton 的连接。从 IB 的导航栏中删除后栏按钮。删除代码中后栏按钮的出口。运行您的应用程序,您应该会看到免费为您提供的返回栏按钮。

    【讨论】:

    • 但在我的情况下,取消按钮默认显示。后退按钮没有。
    • 您必须编写了一些代码来执行此操作,或者将其拖放到 IB 中。
    • 碰巧,您是否从对象库中拖放导航栏?
    • 我没有将任何按钮拖到导航栏上。当我控制从第一个视图的表格单元格拖动到它以创建转场时,该栏会自动添加。如果我删除 segue,导航栏将从第二个表格视图控制器中消失。
    • 这是连接检查器显示的内容(添加到我的原始帖子中)。
    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多