5

私のアプリでは、このように初期化されたUINavigationControllersを備えたUITabBarControllerがあります

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

newsViewControllerはUIViewControllerです。タブバーのボタンを押してnewsViewControllerでナビゲーション項目を表示すると、ナビゲーションバーのタイトルが正常に設定されます。newsViewControllerには、initの後に呼び出すメソッド設定があります。設定方法では、このようにタイトルを設定します [[self navigationItem] setTitle:[category_c title]];

問題が発生しました。newsViewControllerにtableViewがあり、セルにタッチすると、選択したニュースを含むUIViewControllerをプッシュし、ナビゲーションバーにタイトルを表示します。

UIViewControllerには、上記のようにタイトルを設定するのと同じ設定方法があります。問題はそれが表示されていないことです。ナビゲーション項目はnullではありません。これは、呼び出すことができ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があり、そこにタイトルを設定しようとしましたが、成功しませんでした。

  • (void)viewDidLoad {self.navigationItem.title =@"テスト"; [スーパーviewDidLoad]; }

[self.navigationController pushViewController: newsViewController animated:YES]; UITableViewを含むUIViewControllerを記述した後[[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"];、セルに触れたときにプッシュしたnewsViewControllerではなく、myTitleというタイトルを取得した場合。

ポインタはありますか?タイトルが正しく設定されていない理由がわかりません。

EDIT2:もう少し読んで、デバッガーでコードを段階的に調べ、rootviewcontrollersをchildViewControllersと比較した後、self.title = @ "title"を設定した後、childViewControllerのviewDidLoadメソッドでnavigationItemが作成されたので、それはゼロの状況ではありません。デバッガーで_navigationItem変数を展開すると、viewDidLoadを離れた後、フィールド_navigationBarはnilになります。rootViewControllersでは、navigationBarはNOT NULLであり、タイトルはそこにあります。ナビゲーションバーがnullの場合、タイトルは表示されないことを読みました。画像では、デバッガーで見たものです。代替テキストhttp://img138.imageshack.us/img138/1513/picture2bq.png今私はこの方向で検索しています。

EDIT1:以下は、parentViewController、firstChildViewController、および2番目のChildViewControllerのコードです。parentViewControllerが表示されます(タイトルはOKです)。BearbeitenActionを呼び出すナビゲーションバーのボタンを押します->最初の子が押されます(タイトルは表示されません)。firstChildViewControllerのナビゲーションバーには、押されたときにスタック上の新しいViewController(secondChildViewController)を押すボタンがあります。2番目のChildViewControllerのタイトルは問題ありません。[戻る]を押すと、firstChildViewControllerのタイトルが[OK]と表示されます。

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";
}
4

3 に答える 3

2

編集#2

私はあなたのコードを調べましたが、すべて問題ないようです。私には場違いに見える唯一のことは、子コントローラーのnavigationItemを使用する代わりに、ナビゲーションコントローラーにサブビューを追加していることです。私はそれがこのように行われるのを見たことがありません。各ViewControllerには、ナビゲーションバーにプッシュされたときにViewControllerを表すUINavigationItemプロパティがあります。背景については、ドキュメントの概要をお読みください。

そのNavigationItemには、設定可能なタイトル、左ボタン、右ボタンがあります...ナビゲーションコントローラーにサブビューを追加することで、タイトルでファンキーなことを実行できるため、これらのプロパティにボタンを設定してみます... 、私はあなたがそれをしているようにそれが行われるのを見たことがないので、それが正しいか間違っているかは本当にわかりません。行う必要がある唯一の変更は、ボタンをUIBarButtonItemクラスに変更することです。試してみる。

オリジナル

ルートビューコントローラーは配列のインデックス0にあります...したがって、これを行う場合:

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

常にルートのタイトルを設定します。次の場所でそれを試してください:

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

子コントローラーのviewWillAppearメソッドでこの種のセットアップを行う方がさらに簡単な場合があります...そうすれば、ナビゲーションコントローラーの子を検索して正しいビューコントローラーを探す必要がなくなります。

お役に立てれば

編集 あなたはinitメソッドでタイトルを設定することだけを試みることができました:

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

このようにして、オブジェクトのinitメソッドがオブジェクトの値の初期化を担当できるようにします(これは良いことです)。

于 2010-02-15T14:06:32.420 に答える
1

setup代わりに、コードをviewDidLoadメソッドに移動する必要があります。viewDidLoadナビゲーションアイテムがすでに設定されている場合に呼び出されます。

タイトルを設定するには、単に使用しself.title = @"my view";ます-navigationItemに直接タイトルを設定しないでください。

于 2010-02-15T15:17:04.323 に答える
0

問題の原因は、このアドレスhttp://sebastiancelis.com/にあるメソッドを使用して追加したnavigationBarのカスタム背景画像でした。基本的に何が起こったのか、そして私は著者から引用します:

カテゴリを使用することで、独自のsetBackgroundImage:メソッドを簡単に追加し、UINavigationBarまたはUINavigationControllerを作成するたびに呼び出すことができます。このメソッドは、UIImageViewをサブビューとしてナビゲーションバーに追加し、そのサブビューをそのスーパービューの後ろに送信するだけです。

ただし、これを試してみると、それが機能するだけであることがすぐにわかります。UIImageViewは確実に表示され、最初は正しいz-indexにあります。ただし、View Controllerをナビゲーションコントローラーのスタックにプッシュまたはポップすると、背景画像が背景にないことがわかります。代わりに、タイトルとナビゲーションバーのボタンをブロックします。これは間違いなく私たちが望んでいることではありません。

ナビゲーションバーの背景を変更するためのこのソリューションを見つけたとき、私はそれが正しいと確信していましたが、そうではなかったようです。

お時間をいただき、ありがとうございました!

于 2010-02-17T12:24:39.530 に答える