2010-02-15 6 views
4

в моем приложении у меня есть UITabBarController с UINavigationControllers инициализированы как этотNavigationItem SETTITLE не работает на втором уровне UIViewController

UINavigationController *newsNavigationController = [[UINavigationController alloc] initWithRootViewController: newsViewControler]; 

newsViewController является UIViewController. Когда я нажимаю кнопку на вкладке, чтобы отобразить элемент навигации с помощью newsViewController, заголовок на панели навигации устанавливается в порядке. в newsViewController у меня есть метод, который я вызываю после init. В способе настройки я установить заголовок, как этот [[self navigationItem] setTitle:[category_c title]];

Проблема приходит сейчас, в моем newsViewController я есть Tableview, когда я коснуться клетки я хочу выдвинуть UIViewController с выбранной новости и в панели навигации показать название.

В UIViewController у меня тот же метод установки, в котором я настраиваю заголовок, как указано выше. Проблема в том, что не показана. Элемент навигации не является нулевым, потому что я могу вызвать self.navigationItem.hidesBackButton = YES;, и он скрывает подкладку каждый раз, но заголовок не отображается.

создать и подтолкнуть новости UIViewController как это, когда клетка прикосновении

if(newsViewController == nil){ 
     newsViewController = [[NewsViewController alloc] init]; 
     [newsViewController setup]; 
    } 
    [self.navigationController pushViewController: newsViewController animated:YES]; 

Метод установки в newsViewController выглядит следующим образом:

- (void) setup { 
    self.navigationItem.hidesBackButton = YES; 
    [self.navigationItem setTitle:@"my view"]; 
} 

в newsViewController я есть viewDidLoad и попытался чтобы установить заголовок там, но без успеха.

  • (пустоты) viewDidLoad { self.navigationItem.title = @ "Тест"; [super viewDidLoad]; }

если после [self.navigationController pushViewController: newsViewController animated:YES]; я пишу [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; UIViewController, который содержит UITableView получает название myTitle вместо этого newsViewController, что я толкнул, когда я прикоснулся к ячейке.

любые указатели? Я не понимаю, почему заголовок установлен неправильно.

EDIT2: После прочтения немного больше и собирается через мой код с шагом отладчика за шагом и сравнение rootviewcontrollers с childViewControllers я заметил, что в методе viewDidLoad в childViewController после установки self.title = @» title ", создается элемент navigationItem, поэтому это не нулевая ситуация. В отладчике, когда я расширяю переменную _navigationItem, поле _navigationBar равно нулю после выхода из viewDidLoad, в rootViewControllers navigationBar NOT NULL, и заголовок есть. Я читал, что если navigationBar имеет значение null, заголовок не будет отображаться. На изображении это то, что я видел в отладчике. alt text http://img138.imageshack.us/img138/1513/picture2bq.png сейчас я ищу в этом направлении.

EDIT1: ниже приведен код parentViewController, firstChildViewController и второго ChildViewController. Просмотр parentViewController (заголовок в порядке). Я нажимаю кнопку на навигационной панели, которая вызывает bearbeitenAction -> первый ребенок нажат (заголовок не отображается). На панели навигации firstChildViewController у меня есть кнопка, которая при нажатии нажимает новый ViewController в стеке (secondChildViewController). Заголовок второго ChildViewController не подходит. Когда я нажимаю Назад, заголовок firstChildViewController отображается ОК.

parentViewController:

//MARK: - 
    //MARK: Initialization methods 
    - (void) setup { 
     dataManipulator = [[DataManipulation alloc] init]; 
     dataManipulator.delegate = self; 

     [self.tabBarItem initWithTitle:[NSString stringWithFormat:@"%@",[category_c title]] image:[UIImage newImageFromResource:[category_c icon]] tag:0]; 

     searchResults = nil; 
     companyDetailsPushed = NO; 
    } 

    //MARK: - 
    //MARK: ViewControllerMethods 
    // Implement loadView to create a view hierarchy programmatically, without using a nib. 
    - (void) loadView { 
     NSLog(@"WatchlistViewController: loadView"); 

     UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease]; 
     [mainView setBackgroundColor:[UIColor whiteColor]]; 
     mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
     mainView.contentMode = UIViewContentModeScaleToFill; 
     [mainView setAutoresizesSubviews:YES]; 

      companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, [[UIScreen mainScreen] applicationFrame].size.width, 322)]; 
     companiesTable.delegate = self; 
     companiesTable.dataSource = self; 
     [mainView addSubview:companiesTable]; 
     [companiesTable release]; 

      self.view = mainView; 
    } 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 
     if(![[category_c subtitle] isEqualToString:@""]) { 
      self.title = [category_c subtitle]; 
     } 
     else { 
      self.title = [category_c title]; 
     } 
    } 

    - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

     if(companyDetailsViewController == nil) { 
      companyDetailsViewController = [[CompanyDetailsScrollViewController alloc] init]; 
      [companyDetailsViewController setup]; 
     } 

     [watchlistDoneBtn setHidden:TRUE]; 
     companyDetailsPushed = YES; 

     if(viewMode == SearchViewMode) 
      [companyDetailsViewController setCompany:[searchResults objectAtIndex:indexPath.row]]; 
     else if(viewMode == WatchlistViewMode) 
      [companyDetailsViewController setCompany:[[[Financial_deAppDelegate sharedAppDelegate] watchlistCompanies] objectAtIndex:indexPath.row]]; 

     [[self navigationController] pushViewController:companyDetailsViewController animated:YES]; 
    } 

- (void) bearbeitenAction:(UIButton *) sender { 
    NSLog(@"Berbeiten btn was pressed"); 
    if(berbeitenViewController == nil){ 
     berbeitenViewController = [[BerbeitenViewController alloc] init]; 
     [berbeitenViewController setup]; 
    } 
    [self.navigationController pushViewController:berbeitenViewController animated:YES]; 
} 

firstChildViewController = berbeitenViewController в коде:

- (void) setup { 
    self.navigationItem.hidesBackButton = YES; 
} 

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    NSLog(@"BerbeitenViewController: loadView"); 

    UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease]; 
    [mainView setBackgroundColor:[UIColor darkGrayColor]]; 
    mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    mainView.contentMode = UIViewContentModeScaleToFill; 
    [mainView setAutoresizesSubviews:YES]; 

    berbeitenBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)]; 
    [berbeitenBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal]; 
    [berbeitenBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside]; 
    [berbeitenBackBtn setEnabled:TRUE]; 
    [self.navigationController.view addSubview:berbeitenBackBtn]; 
    [berbeitenBackBtn release]; 

    berbeitenAddBtn = [[UIButton alloc] initWithFrame:CGRectMake(260, 23, 55, 36)]; 
    [berbeitenAddBtn setBackgroundImage:[UIImage newImageFromResource:@"bearbeiten_add_btn.png"] forState:UIControlStateNormal]; 
    [berbeitenAddBtn addTarget:self action:@selector(addCompany:) forControlEvents:UIControlEventTouchUpInside]; 
    [berbeitenAddBtn setEnabled:TRUE]; 
    [self.navigationController.view addSubview:berbeitenAddBtn]; 
    [berbeitenAddBtn release]; 

    companiesTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, 366)]; 
    companiesTable.delegate = self; 
    companiesTable.dataSource = self; 
    [mainView addSubview:companiesTable]; 
    [companiesTable release]; 

    self.view = mainView; 
} 

- (void)viewDidLoad { 
    NSLog(@"BerbeitenViewController viewDidLoad"); 
    [super viewDidLoad]; 
    self.title = @"Edit watchlist"; 
} 

//MARK: Buttons actions 

- (void) popViewController:(UIButton *) sender { 
    NSLog(@"Pop BerbeitenViewController"); 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

- (void) addCompany:(UIButton *) sender { 
    NSLog(@"Berbeiten addCompany btn pushed"); 
    if(searchViewController == nil){ 
     searchViewController = [[SearchViewController alloc] init]; 
     [searchViewController setup]; 
    } 
    [self.navigationController pushViewController:searchViewController animated:YES]; 
} 

secondChildViewController = searchViewController в коде

- (void) setup { 
    self.navigationItem.hidesBackButton = YES; 
} 

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    NSLog(@"BerbeitenViewController: loadView"); 

    UIView *mainView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] applicationFrame].size.width, [[UIScreen mainScreen] applicationFrame].size.height)] autorelease]; 
    [mainView setBackgroundColor:[UIColor darkGrayColor]]; 
    mainView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    mainView.contentMode = UIViewContentModeScaleToFill; 
    [mainView setAutoresizesSubviews:YES]; 

    searchViewBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(5, 23, 69, 36)]; 
    [searchViewBackBtn setBackgroundImage:[UIImage newImageFromResource:@"back_btn.png"] forState:UIControlStateNormal]; 
    [searchViewBackBtn addTarget:self action:@selector(popViewController:) forControlEvents:UIControlEventTouchUpInside]; 
    [searchViewBackBtn setEnabled:TRUE]; 
    [self.navigationController.view addSubview:searchViewBackBtn]; 
    [searchViewBackBtn release]; 

    self.view = mainView; 
} 


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.title = @"Edit Watchlist"; 
} 
+0

Отличное объяснение ... tl; др; – luvieere

+0

Я возьму это как комплимент :) –

ответ

0

источником проблемы было пользовательское фоновое изображение для navigationBar, которое я добавил с помощью метода, найденного по этому адресу http://sebastiancelis.com/.В основном то, что произошло, и я цитирую автора:

Используя категорию, мы могли бы легко добавить свой собственный setBackgroundImage: метод и называть его всякий раз, когда мы создаем UINavigationBar или UINavigationController. Этот метод просто добавит UIImageView в качестве подкатегории в навигационную панель, а затем отправит этот подпункт в обратную сторону своего окна .

Однако, если вы попробуете это, вы увидите быстро увидите, что это всего лишь работ. UIImageView определенно является видимым и даже первоначально на правильном z-индексе . Однако, как только вы нажмете или позорите контроллер вида на стеке навигационного контроллера , вы, , увидите, что фоновое изображение больше не в фоновом режиме. Вместо этого блокирует заголовок и навигацию. Кнопки на панели. Это определенно не , что мы хотим.

, когда я нашел это решение для изменения фона в Панели навигации я был уверен, что я получил это право, но, кажется, я не сделал ..

еще раз спасибо за ваше время!

+0

Как вы его решили? или вы просто отбрасываете это решение. – Scar

2

РЕДАКТИРОВАТЬ # 2

Я просмотрел ваш код, и все в порядке. Единственное, что выглядит неуместно для меня, это то, что вы добавляете subview в контроллер навигации, вместо того чтобы использовать навигационный элемент child controller. Я никогда не видел, чтобы это делалось так. Каждый ViewController имеет свойство UINavigationItem, которое представляет собой контроллер вида, когда он помещается в панель навигации. Просто прочитайте обзор документации для некоторого фона.

Что NavigationItem имеет заголовок, левую кнопку и правую кнопку, которую вы можете установить ... Я бы попытался настроить ваши кнопки на эти свойства, потому что, добавив subviews в контроллер навигации, он мог бы делать что-то напуганное с заголовком ... Опять же, я никогда не видел, чтобы это делалось так, как вы это делаете, поэтому я не уверен, правильно это или нет. Единственные изменения, которые вам придется внести, - это изменить кнопки на класс UIBarButtonItem. Попробуйте.

Оригинал

Корневая-контроллер с индексом 0 в массиве ... так что если вы это делаете:

[[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"] 

всегда будет устанавливать заголовок корневого. Попробуйте сделать это на:

objectAtIndex:([self.navigationController.viewControllers count] - 1) 

Это может быть даже проще сделать такую ​​установку в методе viewWillAppear контроллера дочернего ... таким образом вам не придется искать через детей в навигационный контроллер для правильного просмотрите контроллер.

надеюсь, что это помогает

EDIT Вы можете попробовать только установив название в методе инициализации:

-(id)init { 
    if (self = [super init]) { 
     self.title = @"My Title"; 
    } 
    return self; 
} 

Таким образом, вы позволяете метод инициализации объекта, чтобы быть ответственным за инициализацией значения объекта (что хорошо).

+0

привет Райан, я попытался поместить [[self.navigationController.viewControllers objectAtIndex: ([self.navigationController.viewControllers count] - 1)] setTitle: @ "myTitle"]; но эффект был тот же. Кроме того, в childviewController я устанавливаю [self setTitle: @ "myView"], и результат тот же :(нет названия. –

+0

Хммм ... Я не вижу ничего другого на основе кода, который вы опубликовали. перейдя через ваш код с помощью отладчика? Я знаю, что у меня сначала были проблемы с этим материалом, и пошагово это помогло много. Используете ли вы 2 разных наконечника для своих взглядов или они находятся в одном и том же банке? название, поэтому, возможно, это что-то действительно малое. –

+0

Я делаю все по коду, если я устанавливаю [self.navigationItem setTitle: @ «Редактировать список наблюдения»], и я выталкиваю из childViewController другое представление, когда я нажимаю кнопку " назад ", чтобы перейти к childViewController, заголовок установлен! Когда я снова нажимаю« назад », чтобы перейти в таблицуView, а затем выбрать другую ячейку, название не отображается ... –

1

Вместо этого следует переместить код setup в метод viewDidLoad. viewDidLoad вызывается, когда элемент навигации уже настроен для вас.

Чтобы установить заголовок, просто используйте self.title = @"my view"; - вы не должны устанавливать заголовок непосредственно в файле navigationItem.

+0

привет, St3fan, я сделал то, что вы предложили. в дочернем UIViewController в методе viewDidload я устанавливаю self.title = @ "my view", но заголовок не появляется в первый раз. если вы нажмете еще один вид и нажмите кнопку «Назад», появится заголовок «my view» ... я действительно не знаю, почему это происходит. –

+0

hi St3fan, я добавил код в родительском и дочернем контроллерах представления в редактировании. возможно, я увижу что-то не так с тем, что я сделал. Спасибо! –