在iOS中覆盖Back按钮时出现问题

时间:2011-09-08 02:50:06

标签: iphone objective-c cocoa-touch uinavigationcontroller uibarbuttonitem

我有一个UITableViewController A,它将UITableViewController B推送到堆栈上。

在A中我有代码:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Trending" 
                                                                                     style:UIBarButtonItemStylePlain 
                                                                                    target:self 
                                                                                    action:@selector(backButtonClicked:)];

backButtonClicked:也已实现。

B的标题为趋势,但当我点击它时,它无法触及backButtonClicked:

为什么会这样?

3 个答案:

答案 0 :(得分:1)

尝试设置委托:

[navigationController setDelegate:self];

或使用左键。有时后退按钮不适用于某些视图,我不得不使用左按钮:

self.navigationItem.leftBarButtonItem =  [[UIBarButtonItem alloc] initWithTitle:@"Trending" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked:)];

此外,您可以尝试设置B的按钮项而不是A:

viewControllerB.navigationItem.backBarButtonItem =  [[UIBarButtonItem alloc] initWithTitle:@"Trending" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked:)];

答案 1 :(得分:1)

在Xcode文档中,它声明backBarButtonItem目标和操作应设置为nil。因此,即使你确实设置了它,它也可能是一个很好的选择,它会被忽略。您可以查看下面的链接,将自定义行为添加到后退按钮。

Custom Action on Back Button Item

或者您可以在viewControllerB中执行以下操作:

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Trending" 
                                                                             style:UIBarButtonItemStylePlain 
                                                                            target:self
                                                                            action:@selector(backButtonClicked:)] autorelease];

然后还将其添加到viewControllerB

- (void)backButtonClicked:(id)sender {

    [[[self.navigationController viewControllers] objectAtIndex:0] backButtonClicked:sender];

    [self.navigationController popViewControllerAnimated:YES];

}

上面的方法将找到RootViewController并向其发送backButtonClicked消息。然后它将弹出当前视图控制器,这应该允许您模拟backBarButtonItem。您还可以通过更改objectAtIndex方法中的值来更改要发送消息的视图控制器。

答案 2 :(得分:0)

尝试不使用backBarButtonItem而是使用leftBarButtonItem

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Trending" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked:)];
self.navigationItem.hidesBackButton=YES;
对我来说,它就像一个魅力。并且不要忘记您没有释放此按钮 - 它可能导致内存泄漏。所以你可以在为你指定按钮时添加自动释放按钮或者像这样添加

UIBarButtonItem *myBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Trending" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked:)];
self.navigationItem.leftBarButtonItem = myBackButton;
[myBackButton release];
self.navigationItem.hidesBackButton=YES;