2014-01-20 4 views
1

Я думаю, что это должно быть просто, но я остаюсь царапать голову. У меня есть приложение с несколькими настройками ViewControllers в раскадровке. Я хочу, чтобы каждый из них имел одну и ту же навигационную панель в верхней части каждого вида, но этот навигационный контроллер имел одинаковые кнопки для всех видов. Контроллер навигации настроен в AppDelegate, и кнопки добавляются в ViewDidLoad каждого ViewController (в соответствии с ответом, который я получил здесь для другого вопроса), но на данный момент кнопки (и заголовок) не отображаются.Программно добавить кнопку в UINavigationController

Если 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]; 
} 

У меня есть несколько NSLogs, которые показывают, что (если ничего) в навигации контроллер показывает: и что указывает, что кнопки добавляются, но не отображаются?

EDIT:

Я просто вспомнил, что есть ViewController (InitViewController.m), который вызывается перед ВК в приведенном выше коде. Навигационный контроллер размещается здесь:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainVC"]; 
} 

Возможно, это является причиной проблемы.

EDIT 2:

Благодаря Saurav Mac я отслеживаемые проблему до меня пытается добавить кнопки на «неправильном» контроллер представления. У меня была настройка контроллера навигации в AppDelegate.m, первый контроллер просмотра - InitViewController, который затем вызывает MainViewController как «контроллер верхнего уровня». Не могу поверить, что я пропустил это, спасибо за помощь.

+0

Удалено ли «Main» [ваше имя] раскадровки (так как вы вручную управляя первоначальный контроллер) на 'Настройки проекта> # целевой #> Deployment Info > Основной интерфейс'? – Alladinian

+0

Чувак возвращается к основам, пытались ли вы сначала добавить простой барбатнитет, а не пытаться добавить кнопку изображения? Дайте мне знать, если это работает в первую очередь :) – Pavan

+0

@Pavan - Я только что попробовал: [self.navigationItem setLeftBarButtonItem: [[UIBarButtonItem alloc] initWithTitle: @ "Title" style: UIBarButtonItemStylePlain target: noil action: @selector (showSettings :) ] анимированные: ДА]; еще не повезло ... – Ryan

ответ

5

Либо вы можете создать эту кнопку в общий класс, т.е. подкласса 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; 
+0

Это тоже не работает, я изменил «image.png» на изображение, которое я использовал для чего-то другого, и все же оно не отображается. – Ryan

+0

Пожалуйста, внимательно проверьте, что изображение, которое вы используете, на самом деле находится в формате png, а имя изображения должно быть в двойных кавычках. –

+1

Я использую: «menuButton.png». Кроме того, почему не будет видно название? Я думаю, что что-то не так, что останавливает название и кнопки. – Ryan

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

Изменить его

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

Я пробовал именно это (вы можете видеть, что это прокомментировано в моем коде), но кнопки пока не показывают. – Ryan

0
try This ... 

    In AppDelegate.h 

    @property (strong, nonatomic) UINavigationController *nav; //navigationControlller Object 


    AppDelegate.m 


    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
     UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; 
     UIViewController* mainVC = [mainStoryboard instantiateInitialViewController]; 
     self.nav = [[UINavigationController alloc] initWithRootViewController:mainVC]; 
     [self.window setRootViewController:self.nav]; 
     [_window makeKeyAndVisible]; 
     // Override point for customization after application launch. 
     return YES; 
    } 

    One of the Views: 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     [self setTitle:@"Congress app"]; 

     UIBarButtonItem *showSettingsButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showSettings:)]; 

     self.navigationItem.leftBarButtonItem = showSettingsButton; 

     } 

-(void)showSettings:(id)sender 
{ 
    NSLog(@"showSettings"); 
} 
+0

Этот код почти идентичен моему, и он не работает. – Ryan

+0

Пробовал тот, который работал здесь отлично. –

+0

Имейте в виду код. Есть изменения, которые относятся к следующим методам: 1) - (BOOL) приложение: (UIApplication *) application doneFinishLaunchingWithOptions: (NSDictionary *) launchOptions 2) - (void) viewDidLoad –

0

Попробуйте один:

Дисплей leftBarButtonItem навигационного контроллера:

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]; 

Дисплей rightBarButtonItem навигационного контроллера:

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; 

Может быть, это поможет вам.

+0

Это не работает для меня, так как с другим ответом я вижу панель навигации, но она пуста - даже не заголовок. – Ryan

+0

@ Ryan FYI это отображает btn (влево/вправо), а не название навигации –

+0

вы можете рассказать мне, как вы использовали выше код? –

0

пожалуйста попробуйте это ...

- (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; 
} 
Смежные вопросы