将UIViewController推送到NavigationController实际上并不推送视图

时间:2010-12-09 23:51:56

标签: iphone uitableview ios4 uiviewcontroller

我在表视图控制器(和委托)中有这个代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    DetailStatus *detailViewController = [[DetailStatus alloc] initWithNibName:@"DetailStatus" bundle:nil status:[mStatuses objectAtIndex:indexPath.row]];
    [[self navigationController] pushViewController:detailViewController animated:YES];
    [detailViewController release];     
    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
    NSLog(@"exiting didselectrow");

}

在我的DetailStatus类中:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil status:(NSDictionary *)pStatus {
    NSLog(@"I am being called %d", [pStatus objectForKey:@"id"]);
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {
        // some stuff
    }
    return self;
}

有趣的是,我的DetailStatus实际上正在初始化,在控制台窗口中,它甚至输出"I am being called 000001"但奇怪的是视图没有被推到表视图中......

我已经检查了笔尖名称,没关系。我检查了DetailStatus标题文件,它看起来没问题(像这样):

@interface DetailStatus : UIViewController {

所以有人知道为什么视图没有被推到窗口,即使我已经初始化并推动它了吗?

更新:我尝试将一些调试消息记录到DetailStatus中的viewDidLoad,看起来即使该类被实例化也没有加载视图......我想知道为什么。

UPDATE2:我觉得这可能是我的导航控制器组织错了..我有以下内容:

Login page -> customtabbar -> First table view -> DetailStatus
                           -> Second table view -> DetailStatus

我想我只在该层次结构中维护一个导航控制器。我从未创建过其他导航控制器。我只推动一个又一个的观点。

谢谢大家的答案!我会尽快给出赏金,我会让其他人在赏金到期前先投票。

7 个答案:

答案 0 :(得分:6)

看了之后,这个场景似乎和我一样。第一次做Tab +导航时我遇到了什么。

我确信基于Tab + Navigation的应用程序存在一些问题。 虽然它显示Tab以及导航无法导航基本流程。并且使用如此少的代码解决您的问题非常困难。

而不是这个,我有一个替代解决方案:

在XIB中有一个标签栏后,最简单的方法是将UINavigationController对象从“库”窗口(看起来像金色背景上的左侧导航栏按钮)拖动到选项卡的“树视图”中bar(仅文本视图,而不是GUI)。将其放在标签栏下,然后将标签栏控制器下的现有视图控制器拖动到标签栏下面。

当你去查看该标签时,你会看到它顶部的导航栏...如果你从另一个xib加载导航控制器,你将修改标签栏xib中的导航栏。 / p>

否则你可以在下面跟随最佳网址:

http://books.google.co.in/books?id=2yYlm_2ktFYC&pg=PA179&lpg=PA179&dq=navigation+with+the+tab+based+application+iphoneSDK&source=bl&ots=nf2YYjX5Am&sig=COpHj9wOtsDChQBglpsljSTsElw&hl=en&ei=3ZoFTeGSOI_tsgbc_Iz6CQ&sa=X&oi=book_result&ct=result&resnum=6&ved=0CDAQ6AEwBQ#v=onepage&q&f=false

http://www.youtube.com/watch?v=LBnPfAtswgw

希望这肯定能解决你的问题。

答案 1 :(得分:2)

除非UINavigationController是表格视图控制器的立即父级,否则[self navigationController]将返回nil

根据您的解释,我不清楚它在视图控制器层次结构中的确切位置,但我怀疑您可能在导航控制器中有UITabBarController嵌套,当它应该反过来说。如果您偶然意味着将标签栏推离屏幕(因此您希望标签栏控制器嵌套在导航控制器中),则需要调用以下内容:

UIViewController *parentViewController = self.parentViewController;
[parentViewController.navigationController
    pushViewController:detailViewController
    animated:YES
];

P.S。推送工作正常后,您无需取消选择已点按的行,因为UITableViewController会在视图重新出现时自动执行此操作。

答案 2 :(得分:0)

我没有看到将状态放在视图的init的末尾。猜猜这是你添加的东西。

你不需要做[self pushViewController等而不是navigationController位

答案 3 :(得分:0)

可能是笔尖未正确连接。即在笔尖中,视图和控制器之间没有连接,因此即使正确推动控制器,导航控制器也找不到视图。

只是一个猜测!

答案 4 :(得分:0)

alt text

你需要实现如上所述在选项卡控制器中根据你的选项卡放置导航控制器,在导航控制器中你可以放置你的标签项。你还需要设置标签栏项目的nib文件。然后点击一个标签你得到标签屏幕,并且由于导航控制器,您可以轻松导航。即使您可以在任何选项卡主屏幕的屏幕上导航。 这是您需要实施的方式。

它确实对您有所帮助,但您需要一些逻辑实现。

答案 5 :(得分:0)

你的tableViewController是直接推送到导航控制器还是其间有另一个viewController?检查[self navigationController]的值与导航控制器的值(从您实际安装的位置)

答案 6 :(得分:0)

检查是否已使用导航控制器初始化First Tableview和Second TableView。

添加到tabBar时,是否添加了UINavigationController或仅添加了UIViewController对象。

PM_FirstNavigationController *First_navController = [[PM_FirstNavigationController alloc] initWithRootViewController:FirstTableViewController];

tabBarController.viewControllers= [NSArray arrayWithObject: First_navController];

您必须将视图控制器添加到tabBar中。

然后在调用[self navigationController]时,它会给出导航控制器对象。

此致

萨蒂亚