删除"返回"导航控制器中的文本

时间:2015-12-10 17:30:18

标签: ios swift

我不想看到" Back"转到没有标题的视图控制器时自动显示的文本。我希望在我的应用程序的任何地方都能发生这种情况,我可以在应用程序委托中添加几行代码来实现这一点吗?

在发布此问题之前,我尝试了一些SO的方法,但没有找到成功。我希望在Swift中使用它,而不是Obj-c。

我试过这个没有成功;它运行正常,但后面的文本仍显示在下一个视图控制器中。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

我想将它放在app delegate中,这样就会在我的应用程序中发生,而不是将其放入我项目中的每个swift文件中。有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

有几种不同的方法可以做到这一点。我将提供一个解决方案,为您提供更多灵活性,因为您需要多次显示按钮,隐藏其他时间,以及在其他时间自定义。此示例假定您使用的是基于导航控制器的UI,但可以适用于其他类型。

每当我创建一个应用程序时,我都想创建自己的UIViewController类,并让所有的UIViewControllers继承自这个单一的视图控制器。如果我想为我的所有UIViewControllers定制一些东西,我可以在我的新超类级别执行此操作,因为所有其他视图都继承了它。

在下面的示例代码中,我创建了一个名为MasterViewController的自定义UIViewController。我让所有的UIViewControllers继承自它:ViewController,ViewController2& ViewController3。阅读下面代码中的注释,了解发生了什么。

注意:请确保检查UIViewController不应该有后退按钮的情况,因为没有什么可以返回的情况。您可以将此代码添加到MasterViewController,但我没有为此示例添加。

//=========================================================
//MasterViewController
//=========================================================
// Master View Controller that all UIViewControllers inherit from.

import UIKit

class MasterViewController: UIViewController {
    // This will be title if the user doesn't change it in a subclass.
    var backButtonTitle = "Default Back Title"

    override func viewDidLoad() {
    // This resets the default back button to always be shown unless the user calls createCustomBackButtonWithTitle from child class.
        self.navigationItem.hidesBackButton = false
        super.viewDidLoad()
    }

    func createCustomBackButtonWithTitle(customTitle: String) {
        // Hide the default back button.
        self.navigationItem.hidesBackButton = true

        // Programmatically create custom back button.
        let backButton = UIBarButtonItem(title: customTitle, style: UIBarButtonItemStyle.Plain, target: self, action: "goBack:")
        self.navigationItem.leftBarButtonItem = backButton
    }

    @IBAction func goBack(sender: UIButton!) {
        navigationController?.popViewControllerAnimated(true)
    }
}
//=========================================================
//ViewController
//=========================================================
// This view controller customizes the back name and inherits the default "go back" behavior from MasterViewController.

import UIKit

class ViewController: MasterViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    createCustomBackButtonWithTitle("ButtonName")
    }
}
//=========================================================
//ViewController2
//=========================================================
// This view controller customizes the back name but overrides the default "goBack" behavior from MasterViewController to do something different

import UIKit

class ViewController2: MasterViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        createCustomBackButtonWithTitle("ButtonName 2")
    }

    // Override the back button behavior from super class because we don't want default "back" behavior.
    @IBAction override func goBack(sender: UIButton!) {
    // Costume Code here
    }
}
//=========================================================
//ViewController3
//=========================================================
// This view controller inherits from MasterViewController, but gets the default "back" behavior from a normal
// UINavigationController since it never calls createCustomBackButtonWithTitle to change the behavior

import UIKit

class ViewController3: MasterViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

答案 1 :(得分:0)

大多数人都喜欢做@xdeleon建议的事情,但我高度建议这样做,如果没有其他原因你会打破内置滑动行为以在视图控制器堆栈中向后导航。 SO上有几个答案告诉你如何恢复这种反刷功能,但是作为一个必须在具有200多个视图控制器的现有应用中修复此功能的人,我想保存你很多痛苦。

如果您不介意在故事板中工作,那么请确保您的每个视图控制器都是'导航项的后退按钮文本是一个空字符串。但是,由于要跟踪这些很多,因此在代码中更容易做到,而且我找到的唯一方法就是创建一个{ {1}}视图控制器上的实例变量,并实现视图控制器的cachedTitleviewWillAppear()方法,如下所示:

viewWillDisappear()

您可以将这些方法放在所有视图控制器都扩展的UIViewController子类中,或者更好的是,将这些方法放在override func viewWillAppear(animated: Bool) { // Reset the view controller's title only if it doesn't already have one. if (navigationItem.title == nil || navigationItem.title == "") && navigationItem.titleView == nil { navigationItem.title = cachedTitle } } override func viewWillDisappear(animated: Bool) { if navigationItem.title != nil { // not 'if let'! cachedTitle = navigationItem.title navigationItem.title == "" } } 的类别中的自定义方法中,然后在视图控制器中调用它们&# 39; UIViewControllerviewWillAppear()来电。{/ p>

如果你想使用后退按钮以外的其他东西'<'符号,不要添加自定义后退或左键;只需在导航栏上设置自定义后退指示图像和遮罩。