Ios 以编程方式将按钮添加到UINavigationController

Ios 以编程方式将按钮添加到UINavigationController,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我认为这应该是一个简单的问题,但我还是挠头。我有一个应用程序,在情节提要中设置了多个ViewController。我希望每个视图的顶部都有相同的导航栏,但是这个导航控制器在所有视图上都有相同的按钮。导航控制器在AppDelegate中设置,按钮添加到每个ViewController的ViewDidLoad中(根据我在这里收到的另一个问题的答案),但目前,按钮(和标题)没有显示 其中设置了UINavigationController-AppDelegate.m: - (BOOL)applicati

我认为这应该是一个简单的问题,但我还是挠头。我有一个应用程序,在情节提要中设置了多个ViewController。我希望每个视图的顶部都有相同的导航栏,但是这个导航控制器在所有视图上都有相同的按钮。导航控制器在AppDelegate中设置,按钮添加到每个ViewController的ViewDidLoad中(根据我在这里收到的另一个问题的答案),但目前,按钮(和标题)没有显示

其中设置了UINavigationController-AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
    MainViewController* mainVC = [mainStoryboard instantiateInitialViewController];
    UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:mainVC];

    [self.window setRootViewController:navVC];

    [_window makeKeyAndVisible];

    return YES;
}
其中一个观点是:

- (void)viewDidLoad
{

    [self setTitle:@"Congress app"];  // < This does not set the title of the NavController

    UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showSettings:)];
    UIBarButtonItem *showMenuButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menuButton.png"] style:UIBarButtonItemStylePlain target:self action:@selector(revealMenu:)];

    //self.navigationItem.leftBarButtonItem = showMenuButton;
    //self.navigationItem.rightBarButtonItem = showSettingsButton;
    self.navigationController.navigationItem.leftBarButtonItem = showMenuButton;
    self.navigationController.navigationItem.rightBarButtonItem = showSettingsButton;

    UINavigationController *currentNav;
    UIViewController *VCname;   
    NSLog(@"First left button in navigation controller - %@", [self.navigationController.navigationItem.leftBarButtonItems objectAtIndex:0]);
    NSLog(@"First right button in navigation controller - %@", [self.navigationController.navigationItem.rightBarButtonItems objectAtIndex:0]);
    [super viewDidLoad];  
}
这可能是问题的原因

编辑2:

多亏了Saurav Mac,我才发现问题出在试图在“错误”的视图控制器上添加按钮。我在AppDelegate.m中设置了导航控制器,第一个视图控制器是InitViewController,然后调用MainViewController作为“俯视控制器”。真不敢相信我错过了,谢谢你的帮助

self.navigationController.navigationItem.leftBarButtonItem = showMenuButton;
self.navigationController.navigationItem.rightBarButtonItem = showSettingsButton;
换成

self.navigationItem.leftBarButtonItem = showMenuButton;
self.navigationItem.rightBarButtonItem = showSettingsButton;
换成

self.navigationItem.leftBarButtonItem = showMenuButton;
self.navigationItem.rightBarButtonItem = showSettingsButton;

您可以在一个公共类(即NSObject的子类)中创建此按钮,然后在要添加按钮的每个类中调用此方法,也可以将此代码添加到每个类的ViewDidLoad方法中-

self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]init];

UIImage *img1=[UIImage imageNamed:@"image.png"];
CGRect frameimg1 = CGRectMake(0, 0, img1.size.width, img1.size.height);
UIButton *signOut=[[UIButton alloc]initWithFrame:frameimg1];
[signOut setBackgroundImage:img1 forState:UIControlStateNormal];
[signOut addTarget:self action:@selector(BackButtonPressed)
  forControlEvents:UIControlEventTouchUpInside];
[signOut setShowsTouchWhenHighlighted:YES];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:signOut];
self.navigationItem.leftBarButtonItem=barButton;

您可以在一个公共类(即NSObject的子类)中创建此按钮,然后在要添加按钮的每个类中调用此方法,也可以将此代码添加到每个类的ViewDidLoad方法中-

self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]init];

UIImage *img1=[UIImage imageNamed:@"image.png"];
CGRect frameimg1 = CGRectMake(0, 0, img1.size.width, img1.size.height);
UIButton *signOut=[[UIButton alloc]initWithFrame:frameimg1];
[signOut setBackgroundImage:img1 forState:UIControlStateNormal];
[signOut addTarget:self action:@selector(BackButtonPressed)
  forControlEvents:UIControlEventTouchUpInside];
[signOut setShowsTouchWhenHighlighted:YES];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:signOut];
self.navigationItem.leftBarButtonItem=barButton;
试试这个:

显示导航控制器的左按钮图标:

    UIImage *faceImage = [UIImage imageNamed:@"back_arrow.png"];
    UIButton *face = [UIButton buttonWithType:UIButtonTypeCustom];
    face.bounds = CGRectMake( 10, 0, faceImage.size.width, faceImage.size.height );
    [face addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
    [face setImage:faceImage forState:UIControlStateNormal];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:face];
    self.navigationItem.leftBarButtonItem = backButton;
    [self.navigationItem setHidesBackButton:YES animated:YES];
    [self.navigationItem setLeftBarButtonItem:nil animated:NO];
    [self.navigationItem setBackBarButtonItem:nil];
UIImage *faceImage1= [UIImage imageNamed:@"slideshowarrow"];
UIButton *face1 = [UIButton buttonWithType:UIButtonTypeCustom];
face1.bounds = CGRectMake( 10, 0, faceImage1.size.width, faceImage1.size.height );
[face1 addTarget:self action:@selector(Goto_nextView) forControlEvents:UIControlEventTouchUpInside];
[face1 setImage:faceImage1 forState:UIControlStateNormal];
UIBarButtonItem *backButton1 = [[UIBarButtonItem alloc] initWithCustomView:face1];
self.navigationItem.rightBarButtonItem = backButton1;
显示导航控制器的右按钮图标:

    UIImage *faceImage = [UIImage imageNamed:@"back_arrow.png"];
    UIButton *face = [UIButton buttonWithType:UIButtonTypeCustom];
    face.bounds = CGRectMake( 10, 0, faceImage.size.width, faceImage.size.height );
    [face addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
    [face setImage:faceImage forState:UIControlStateNormal];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:face];
    self.navigationItem.leftBarButtonItem = backButton;
    [self.navigationItem setHidesBackButton:YES animated:YES];
    [self.navigationItem setLeftBarButtonItem:nil animated:NO];
    [self.navigationItem setBackBarButtonItem:nil];
UIImage *faceImage1= [UIImage imageNamed:@"slideshowarrow"];
UIButton *face1 = [UIButton buttonWithType:UIButtonTypeCustom];
face1.bounds = CGRectMake( 10, 0, faceImage1.size.width, faceImage1.size.height );
[face1 addTarget:self action:@selector(Goto_nextView) forControlEvents:UIControlEventTouchUpInside];
[face1 setImage:faceImage1 forState:UIControlStateNormal];
UIBarButtonItem *backButton1 = [[UIBarButtonItem alloc] initWithCustomView:face1];
self.navigationItem.rightBarButtonItem = backButton1;
可能会对你有帮助。

试试这个:

显示导航控制器的左按钮图标:

    UIImage *faceImage = [UIImage imageNamed:@"back_arrow.png"];
    UIButton *face = [UIButton buttonWithType:UIButtonTypeCustom];
    face.bounds = CGRectMake( 10, 0, faceImage.size.width, faceImage.size.height );
    [face addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
    [face setImage:faceImage forState:UIControlStateNormal];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:face];
    self.navigationItem.leftBarButtonItem = backButton;
    [self.navigationItem setHidesBackButton:YES animated:YES];
    [self.navigationItem setLeftBarButtonItem:nil animated:NO];
    [self.navigationItem setBackBarButtonItem:nil];
UIImage *faceImage1= [UIImage imageNamed:@"slideshowarrow"];
UIButton *face1 = [UIButton buttonWithType:UIButtonTypeCustom];
face1.bounds = CGRectMake( 10, 0, faceImage1.size.width, faceImage1.size.height );
[face1 addTarget:self action:@selector(Goto_nextView) forControlEvents:UIControlEventTouchUpInside];
[face1 setImage:faceImage1 forState:UIControlStateNormal];
UIBarButtonItem *backButton1 = [[UIBarButtonItem alloc] initWithCustomView:face1];
self.navigationItem.rightBarButtonItem = backButton1;
显示导航控制器的右按钮图标:

    UIImage *faceImage = [UIImage imageNamed:@"back_arrow.png"];
    UIButton *face = [UIButton buttonWithType:UIButtonTypeCustom];
    face.bounds = CGRectMake( 10, 0, faceImage.size.width, faceImage.size.height );
    [face addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
    [face setImage:faceImage forState:UIControlStateNormal];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:face];
    self.navigationItem.leftBarButtonItem = backButton;
    [self.navigationItem setHidesBackButton:YES animated:YES];
    [self.navigationItem setLeftBarButtonItem:nil animated:NO];
    [self.navigationItem setBackBarButtonItem:nil];
UIImage *faceImage1= [UIImage imageNamed:@"slideshowarrow"];
UIButton *face1 = [UIButton buttonWithType:UIButtonTypeCustom];
face1.bounds = CGRectMake( 10, 0, faceImage1.size.width, faceImage1.size.height );
[face1 addTarget:self action:@selector(Goto_nextView) forControlEvents:UIControlEventTouchUpInside];
[face1 setImage:faceImage1 forState:UIControlStateNormal];
UIBarButtonItem *backButton1 = [[UIBarButtonItem alloc] initWithCustomView:face1];
self.navigationItem.rightBarButtonItem = backButton1;
可能对你有帮助。

请试试这个

- (void)viewDidLoad
{

     [super viewDidLoad];

     CGRect frameimgback1 = CGRectMake(0, 0, 60, 35);
     UIButton *button = [[UIButton alloc] initWithFrame:frameimgback1];
     [button addTarget:self action:@selector(back)  forControlEvents:UIControlEventTouchUpInside];
     [button setTitle:@"Ravindra" forState:UIControlStateNormal];
     UIBarButtonItem *btnL = [[UIBarButtonItem alloc] initWithCustomView:button];
     self.navigationItem.leftBarButtonItem = btnL;
}
请试试这个

- (void)viewDidLoad
{

     [super viewDidLoad];

     CGRect frameimgback1 = CGRectMake(0, 0, 60, 35);
     UIButton *button = [[UIButton alloc] initWithFrame:frameimgback1];
     [button addTarget:self action:@selector(back)  forControlEvents:UIControlEventTouchUpInside];
     [button setTitle:@"Ravindra" forState:UIControlStateNormal];
     UIBarButtonItem *btnL = [[UIBarButtonItem alloc] initWithCustomView:button];
     self.navigationItem.leftBarButtonItem = btnL;
}


我尝试过这个(你可以在我的代码中看到它被注释掉了),但是按钮仍然不显示。我尝试过这个(你可以在我的代码中看到它被注释掉了),但是按钮仍然不显示。这似乎也不起作用,我已将“image.png”更改为我用于其他用途的图像,但仍然没有显示。请仔细检查您使用的图像是否为png格式,并且图像名称应为双引号。我使用的是:“menuButton.png”。还有,为什么标题不显示?我想是出了什么问题,停止了标题和按钮的显示。那么你的导航栏一定有问题。仔细跟踪你的导航栏,你是如何为那个特定的视图分配它的。你能把你正在使用的代码发送到alloc bar按钮上吗?这似乎也不起作用,我已将“image.png”更改为我用于其他用途的图像,但仍然没有显示。请仔细检查您使用的图像是否为png格式,并且图像名称应为双引号。我使用的是:“menuButton.png”。还有,为什么标题不显示?我想是出了什么问题,停止了标题和按钮的显示。那么你的导航栏一定有问题。仔细跟踪您的导航栏,您是如何为该特定视图分配的。请将您正在使用的代码发送到alloc bar按钮。请仔细观察代码。以下方法有更改:1)-(BOOL)应用程序:(UIApplication*)应用程序完成启动时使用选项:(NSDictionary*)启动选项2)-(无效)ViewDidLoad我已将此代码复制到我的上,但仍然无法工作。我连标题都拿不出来。嘿,瑞安。你有什么解决办法吗?嗨,是的,我最后有。请参阅问题中的我的编辑-这取决于另一个视图控制器中分配的导航控制器。请仔细观察代码..以下方法有更改:1)-(BOOL)应用程序:(UIApplication*)应用程序did完成启动WithOptions:(NSDictionary*)启动选项2)-(void)VIEWDIDLOAD我已经将此代码复制到我的代码上,但它仍然不起作用。我连标题都拿不出来。嘿,瑞安。你有什么解决办法吗?嗨,是的,我最后有。请参阅问题中的我的编辑-这取决于另一个视图控制器中分配的导航控制器。您是否删除了
项目设置>#目标#>部署信息>主界面
上的“Main”[您的故事板名称](因为您正在手动管理初始控制器)?Dude让我们回到基础,你是否尝试过先添加一个普通的按钮,而不是尝试在图像中添加一个按钮?首先让我知道这是否有效:)@Pavan-我刚刚尝试过:[self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc]initWithTitle:@“Title”样式:UIBarButtonItemStylePlain目标:无操作:@selector(showSettings:)]动画:是];仍然不走运…请检查此操作可能会解决您的问题您是否删除了
项目设置>#目标#>部署信息>主界面上的“主”[故事板名称](因为您正在手动管理初始控制器)
?Dude让我们回到基本问题,您是否尝试先添加一个普通的barbuttonitem,而不是尝试在图像中添加按钮?首先让我知道这是否有效:)@Pavan-我刚刚尝试过:[self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc]initWithTitle:@“Title”样式:UIBarButtonItemStylePlain目标:无操作:@selector(showSettings:)]动画:是];仍然不走运…请检查此项可能会解决您的问题这对我不起作用,就像其他答案一样,我可以看到导航栏,但它是空的-甚至没有标题。@Ryan FYI它显示的是btn(左/右)而不是导航标题或者我似乎一开始就犯了一个巨大的错误,您发布的代码还可以,但我的程序