gpt4 book ai didi

iphone - NavigationItem setTitle 不适用于第二级 UIViewController

转载 作者:行者123 更新时间:2023-12-03 19:16:32 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个 UITabBarController ,其 UINavigationControllers 像这样初始化

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

newsViewController 是一个 UIViewController。当我按下选项卡栏中的按钮以使用 newsViewController 显示导航项时,导航栏中的标题设置正常。在 newsViewController 中,我有一个在初始化后调用的方法设置。在设置方法中我这样设置标题[[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 并尝试在那里设置标题,但没有成功。

  • (void)viewDidLoad {self.navigationItem.title = @"测试";[ super viewDidLoad];}

如果在[self.navigationController PushViewController:newsViewController动画:YES]之后;我写 [[self.navigationController.viewControllers objectAtIndex:0] setTitle:@"myTitle"]; 包含 UITableView 的 UIViewController 获取标题 myTitle 而不是我触摸单元格时推送的 newsViewController .

有什么指示吗?我不明白为什么标题设置不正确。

EDIT2:在阅读了更多内容并使用调试器逐步浏览我的代码并将 rootviewcontrollers 与 childViewControllers 进行比较后,我在设置 self.title = @ 后在 childViewController 的 viewDidLoad 方法中观察到了这一点“title”导航项被创建,所以它不是零的情况。在调试器中,当我展开 _navigationItem 变量时,离开 viewDidLoad 后字段 _navigationBar 为 nil,在 rootViewControllers 中,navigationBar 不为 NULL,标题也在那里。我读到,如果导航栏为空,标题将不会显示。图中是我在调试器中看到的。 alt text http://img138.imageshack.us/img138/1513/picture2bq.png现在我正在朝这个方向寻找。

编辑1:下面是parentViewController、firstChildViewController 和第二ChildViewController 的代码。查看parentViewController(标题可以)。我按下导航栏上的一个按钮,调用 bearbeitenAction -> 第一个子项被推送(标题未显示)。在第一个ChildViewController的导航栏上,我有一个按钮,按下该按钮时会将新的ViewController推送到堆栈上(第二个ChildViewController)。第二个ChildViewController的标题不行。当我按“返回”时,第一个ChildViewController 的标题将显示“确定”。

父 View Controller :

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

代码中的 secondaryChildViewController = 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";
}

最佳答案

编辑 #2

我查看了你的代码,一切似乎都正常。对我来说唯一不合适的是您向导航 Controller 添加 subview 而不是使用子 Controller 的 navigationItem。我从来没有见过这样做的。每个ViewController都有一个UINavigationItem当 View Controller 被推到导航栏上时,它代 TableView Controller 的属性。只需阅读文档概述即可了解一些背景信息。

该 NavigationItem 有一个标题、左按钮和右按钮,您可以设置...我会尝试将按钮设置为这些属性,因为通过向导航 Controller 添加 subview ,它可能会对标题做一些奇怪的事情。 ..再说一次,我从来没有见过你这样做,所以我不确定它是对还是错。您需要进行的唯一更改是将按钮更改为 UIBarButtonItem 类。尝试一下。

原创

Root View Controller 位于数组中的索引 0...所以如果您这样做:

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

它将始终设置根的标题。尝试这样做:

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

在子 Controller 的 viewWillAppear 方法中进行这种设置甚至可能更容易......这样您就不必在导航 Controller 的子级中搜索正确的 View Controller 。

希望这有帮助

编辑您可以尝试仅在 init 方法中设置标题:

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

这样,您就允许对象的 init 方法负责初始化对象的值(这是一件好事)。

关于iphone - NavigationItem setTitle 不适用于第二级 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2266300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com