0

在我的 RootViewController 中,我将图像设置为 rightBarButtonItem 就像这样,但是在我创建的第二个 ViewController 中,这个“后退”按钮不会显示。我在模拟器和我的 iPhone 上运行它,我可以点击应该显示按钮的区域并调用 goBack{} 方法。只是图像没有显示。有什么想法吗?

此外,就图像而言,我导出它们的方式与导出所有其他图像的方式完全相同。所有其他人都工作正常。图像似乎没有问题,因为我已经用后退按钮图像替换了其他几个图像,但它们都没有显示。我很确定我正在以正确的顺序创建这些图像。无论如何,任何帮助将不胜感激。

从我的 NewGameViewController.m 文件中:

- (void)viewDidLoad {
    [super viewDidLoad];

    CGFloat startingPoint = 0.0;
    CGRect bounds = self.view.bounds;
    bounds.origin.y = startingPoint;
    bounds.size.height -= startingPoint;

    self.ivarNewGameTableView = [[UITableView alloc] initWithFrame:bounds style:UITableViewStyleGrouped];
    self.ivarNewGameTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    self.ivarNewGameTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:self.ivarNewGameTableView];

    UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
    self.ivarNewGameTableView.backgroundView = backgroundImageView;

    UIImage *mainNavBar = [UIImage imageNamed:@"startNewGameNavBar.png"];
    UIImageView *navBarView = [[UIImageView alloc] initWithImage:mainNavBar];
    [navBarView setFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
    [self.navigationController.navigationBar addSubview:navBarView];

    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];

    // neither one of the following lines work.  I know they're supposed to be identical, but
    // seen Xcode be picky.
    back.frame = CGRectMake(0.0, 0.0, 54.0, 36.0);
//    [back setFrame:CGRectMake(0.0, 0.0, 54.0, 36.0)];

    [back addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
    [back setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
    [back setImage:[UIImage imageNamed:@"backTouched.png"] forState:UIControlStateHighlighted];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:back];
    self.navigationItem.leftBarButtonItem = backButton;
}

-(void)goBack {
    NSLog(@"goBack called.");
//    [self.ivarNewGameTableView pushViewController:];
}
4

2 回答 2

2

如果您在导航堆栈中,则为您设置后退按钮项目。正确使用backBarButtonItem会得到你喜欢的行为。

在您想要返回的主视图控制器上,您需要重载该backBarButton项目。

UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle: @"Back" style: UIBarButtonItemStyleBordered target: nil action: nil];

self.navigationItem.backBarButtonItem = newBackButton;

github上的一些代码示例

于 2012-12-06T01:13:30.150 回答
0

好的。终于想通了。问题在于创建我的新游戏视图导航栏时的这一行:

[self.navigationController.navigationBar addSubview:navBarView];

我也在我的根视图的导航栏中这样做了。现在看起来像这样,在两个文件中:

UIImage *startNewGameNavBar = [UIImage imageNamed:@"startNewGameNavBar.png"];

// with the key line being this one
[self.navigationController.navigationBar setBackgroundImage:startNewGameNavBar forBarMetrics:UIBarMetricsDefault];

用菜鸟来说,我希望更多的程序员会使用像我这样的菜鸟,如果您遇到按钮消失在自定义导航栏后面的问题,并且您使用的代码看起来像我的示例,那是因为您是不应该将其添加为子视图。这将其置于其他一切之上。相反,更改导航栏的背景图像,当然,图像会在...(请打鼓)...背景中结束。(结束鼓声)

至于按钮图像的添加,我刚刚创建了一个自定义类型的 UIButton,将图像设置为正常和高亮状态,设置按钮调用我的 goBack 方法,设置其帧大小,并将其分配给 navigationItem 的 leftBarButtonItem 属性:

UIButton *backButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@"backTouched.png"] forState:UIControlStateHighlighted];
[backButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
[backButton setFrame:CGRectMake(0.0, 0.0, 54.0, 36.0)];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
于 2012-12-07T17:00:47.757 回答