ios Swift 自定义后退按钮和目的地
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24844568/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Swift Custom Back Button and Destination
提问by Prateek
I am currently using SWRevealViewController for a sidebar menu in my app. When I click one of the options, the destination view controller doesn't have a 'back' button because it hasn't come from a proper view controller (i.e. page to go back to).
我目前在我的应用程序中使用 SWRevealViewController 作为侧边栏菜单。当我单击其中一个选项时,目标视图控制器没有“返回”按钮,因为它不是来自正确的视图控制器(即要返回的页面)。
Therefore I am wanting to manually create a back button on the destination view controller which will go back to the home view controller.
因此,我想在目标视图控制器上手动创建一个后退按钮,该按钮将返回主视图控制器。
I have looked at the code here: How do I manually set the "Back" destination in iOS apps
我在这里查看了代码:如何在 iOS 应用程序中手动设置“返回”目标
But I am struggling to implement this in Swift (one error after another!). Any help? Thanks!
但我正在努力在 Swift 中实现这一点(一个又一个错误!)。有什么帮助吗?谢谢!
EDIT
编辑
I have tried the suggestion below, but the back button just doesn't appear. This may have something to with the fact I have the navbar hidden in other views and do the following on the destination view:
我已经尝试了下面的建议,但后退按钮没有出现。这可能与我将导航栏隐藏在其他视图中并在目标视图上执行以下操作有关:
override func viewDidLoad() {
super.viewDidLoad()
navigationController.setNavigationBarHidden(false, animated:true)
var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside)
var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton)
self.navigationItem.leftBarButtonItem = myCustomBackButtonItem
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func popToRoot(sender:UIBarButtonItem){
self.navigationController.popToRootViewControllerAnimated(true)
}
Not sure why the back button won't show up?
不知道为什么后退按钮不会出现?
Edit
编辑
This is the prepareForSegue from my sidebar view controller. If there is a way to check for the segue identifier 'test' then I can set the back button from here?
这是我的侧边栏视图控制器中的 prepareForSegue。如果有办法检查 segue 标识符“test”,那么我可以从这里设置后退按钮吗?
- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
// Set the title of navigation bar by using the menu items
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
destViewController.title = [[_menuItems objectAtIndex:indexPath.row] capitalizedString];
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
}
回答by codester
You can write that in swift like this
你可以像这样用swift写
Write this to add button on navigationController
写这个来添加按钮 navigationController
navigationController.setNavigationBarHidden(false, animated:true)
var myBackButton:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
myBackButton.addTarget(self, action: "popToRoot:", forControlEvents: UIControlEvents.TouchUpInside)
myBackButton.setTitle("YOUR TITLE", forState: UIControlState.Normal)
myBackButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
myBackButton.sizeToFit()
var myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton)
self.navigationItem.leftBarButtonItem = myCustomBackButtonItem
this will pops to rootViewController
这将弹出 rootViewController
func popToRoot(sender:UIBarButtonItem){
self.navigationController.popToRootViewControllerAnimated(true)
}
回答by Sourabh Sharma
Swift 3.0Solution:
Swift 3.0解决方案:
self.navigationController?.setNavigationBarHidden(false, animated:false)
//Create back button of type custom
let myBackButton:UIButton = UIButton.init(type: .custom)
myBackButton.addTarget(self, action: #selector(ViewController.popToRoot(sender:)), for: .touchUpInside)
myBackButton.setTitle("Back".localized(), for: .normal)
myBackButton.setTitleColor(.blue, for: .normal)
myBackButton.sizeToFit()
//Add back button to navigationBar as left Button
let myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton)
self.navigationItem.leftBarButtonItem = myCustomBackButtonItem
func popToRoot(sender:UIBarButtonItem){
_ = self.navigationController?.popToRootViewController(animated: true)
}
回答by swiftBoy
In Swift 2.1
在Swift 2.1 中
I am customizing Navigation Bar Itemsthis way
我正在以这种方式自定义导航栏项目
- I can change Navigation bar background image, title text, text color
- I can show/hide back button
- I can Change Title/ Icon or custom action method
- 我可以更改导航栏背景图像、标题文本、文本颜色
- 我可以显示/隐藏后退按钮
- 我可以更改标题/图标或自定义操作方法
In AppDelegateI have
在 AppDelegate我有
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
//Cutomize navigation bar
let navBgImage:UIImage = UIImage(named: "dummy_navigation_bg_image")!
UINavigationBar.appearance().setBackgroundImage(navBgImage, forBarMetrics: .Default)
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()];
return true
}
In ViewControllerI update Navigation Items in viewWillAppear method this way
在 ViewController 中,我以这种方式更新 viewWillAppear 方法中的导航项
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
setupNavigationBar()
}
// MARK: - NavigationBar methods
func setupNavigationBar ()
{
//current tab screen title
tabBarController?.title = "Manage"
//Hide back button or left bar button
tabBarController?.navigationItem.leftBarButtonItem = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
//custom right bar button
var image = UIImage(named: "dummy_settings_icon")
image = image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)
tabBarController?.navigationItem.rightBarButtonItem = UIBarButtonItem(image: image, style: UIBarButtonItemStyle.Plain, target: self, action: "settingButtonAction")
}
func settingButtonAction()
{
print("Setting Button tapped")
performSegueWithIdentifier("loadAccountSettingsSegue", sender: nil)
}
回答by jlhonora
Here's an updated version for Swift 2/2.1:
这是 Swift 2/2.1 的更新版本:
self.navigationController? .setNavigationBarHidden(false, animated:true)
let backButton = UIButton(type: UIButtonType.Custom)
backButton.addTarget(self, action: "methodCall:", forControlEvents: UIControlEvents.TouchUpInside)
backButton.setTitle("TITLE", forState: UIControlState.Normal)
backButton.sizeToFit()
let backButtonItem = UIBarButtonItem(customView: backButton)
self.navigationItem.leftBarButtonItem = backButtonItem
回答by Roma Kavinskyi
Swfit 5 / XCode 11.4
Swfit 5 / XCode 11.4
override func viewDidLoad() {
super.viewDidLoad()
navigationController!.setNavigationBarHidden(false, animated: true)
let myBackButton:UIButton = UIButton(type: UIButton.ButtonType.custom) as UIButton
myBackButton.addTarget(self, action: #selector(popToRoot), for: UIControl.Event.touchUpInside)
myBackButton.setTitle("YOUR TITLE", for: UIControl.State.normal)
myBackButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
myBackButton.sizeToFit()
let myCustomBackButtonItem:UIBarButtonItem = UIBarButtonItem(customView: myBackButton)
self.navigationItem.leftBarButtonItem = myCustomBackButtonItem
}
Also, popToRoot you should mark as @objc
另外, popToRoot 你应该标记为@objc
@objc func popToRoot() {
//enter action here
}