更改ViewController的所有屏幕的后退按钮图像

时间:2015-08-01 08:36:10

标签: ios swift navigationbar navigationitem

我在下面的代码中更改了下一个屏幕上的后退按钮图像。

我的应用程序中有30个屏幕,我希望所有30个屏幕上的后退按钮相同。是否有可能我不会在所有30个屏幕上复制粘贴此代码,只需编写一次,而是在30个屏幕上重复使用。

此外,当我重复使用时,带有后退按钮的代码在所有屏幕上都可以正常工作

我使用的是iOS 8和Xcode 6。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backButtonImage: UIImage = UIImage(named: "back")!
    var backBarItem: UIBarButtonItem = UIBarButtonItem(image: backButtonImage, style: UIBarButtonItemStyle.Plain, target: self, action: Selector("method"))

    segue.destinationViewController.navigationItem.leftBarButtonItem = backBarItem;
}

func method() {
    self.navigationController?.popViewControllerAnimated(true)
}

5 个答案:

答案 0 :(得分:1)

要在iOS中一般更改UI-Elements的外观,请查看UIAppearance。这样您就可以设置一次,它将在您的应用中随处可见。

我建议在AppDelegate application:didFinishLaunchingWithOptions:中设置它。

试试这个:

let backImg: UIImage = UIImage(named: "back")!
UIBarButtonItem.appearance().setBackButtonBackgroundImage(backImg, forState: .Normal, barMetrics: .Default)

答案 1 :(得分:1)

我的应用中只有一个导航控制器,所以这可能有用也可能没用。但是,我创建了UINavigationController的子类。然后在这个子类中,我重写了pushViewController方法:

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    let pushingVC = viewControllers[viewControllers.count - 1]
    let backItem = UIBarButtonItem()
    backItem.title = ""
    pushingVC.navigationItem.backBarButtonItem = backItem
    super.pushViewController(viewController, animated: animated)
}

这样,每次按下viewController时都会这样,从我的customNavigationController,它为每个视图使用自定义后退按钮。您必须确保将UINavigationControllers类型更改为自定义子类。但是,这适用于Swift 3.0。

答案 2 :(得分:0)

我不太确定你想要什么,所以我会回答大部分我认为你可能想要的东西以及将来看到这个的人。

首先:您需要一个类似于默认Apple应用程序的后退按钮。为此,您需要a)获取目标场景及其视图控制器的引用。我将假设您已经这样做并将其设置为controller以供将来参考。 b)您需要设置左栏按钮项。设置为:

controller.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Insert Title Here!!", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

将所有这些放在prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)中(您还可以找到目标场景,可能是segue.destinationViewController

第二:您想使用名为"返回"的图像对于所有项目。如果是这样,重复上面的步骤a),并插入这个方便的代码:

UIBarButtonItem(image: "Back", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

我也知道你不需要复制它,但它并不像计算机那样密集,而且它可能是最简单的。

第三:你很聪明,不讨厌编程方面的进步,所以你想要使用故事板。如果是这样,只需从对象菜单中拖动导航栏,添加导航项,然后将其复制到所有场景。如果您的场景链接到自定义类,那么超级快乐有趣的时间好消息,您可以通过IBAction简单地将导航项链接到您的自定义类,并使用该功能完成您心脏所需的所有花哨编码

第四:你真的,真的不想复制任何东西,即使它并不那么难。如果是这样,您可以使用您自己的自定义类继承UIViewController,添加上面提到的代码,然后将所有未来的UIView类子类化为此。说实话,我并不完全确定这会起作用,而且似乎不必要地费力,但这取决于你。

我现在有点累了,对于我发现有趣的所有事情感到抱歉,但我希望我帮助过,请告诉我,如果我完全错过了你的观点,我可以试着想一个溶液

答案 3 :(得分:0)

您可以使用Appearance()

快速

    let backImage = UIImage(named: "back")
    UINavigationBar.appearance().backIndicatorImage = backImage
    UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedString.Key.foregroundColor:
        UIColor.white], for: .normal)
    UIBarButtonItem.appearance().tintColor = UIColor.green

答案 4 :(得分:0)

您可以全局更改

UINavigationBar.appearance().backIndicatorImage = UIImage(named: "custom-back")
UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(named: "custom-back")

或每个导航控制器。

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.backIndicatorImage = UIImage(named: "custom-back")
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "custom-back")  
}

此处https://sarunw.com/posts/how-to-change-back-button-image/

为详细信息