【问题标题】:What's the difference between the back button on UINavigationController and PopTopViewController?UINavigationController 和 PopTopViewController 上的后退按钮有什么区别?
【发布时间】:2013-10-28 13:31:30
【问题描述】:

我有一个UINavigationController 层次结构,VC1 --> VC2。

VC1 有一个表格视图,当 VC2 完成工作时我需要重新加载它,所以 VC1 有这个代码:

-(void)viewWillAppear:(BOOL)animated
{
    [[self tableView] reloadData];
}

VC2 本质上是与服务器一起在 VC1 中创建一个新的表行。当按下 VC2 中的完成按钮时,我调用[navController popViewControllerAnimated:YES]。所以从用户的角度来看会发生什么:

  1. 访问 VC2,用它为 VC1 中的表创建一个新行。按完成。

  2. 层次结构成功导航回 VC1,但 tableview 不会重新加载并显示新行。

  3. 但是,如果我随后导航到 VC2,并立即点击 navController 后退按钮,则表确实重新加载并显示新行。

那么为什么[tableview reload] 对 3 起作用而不对 2 起作用?非常感谢。

==

更多代码回复answer mentioned below

在应用委托中:

    CWLandingVC *lvc = [[CWLandingVC alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:lvc];
    [[self window] setRootViewController:navController];

在 VC0 中:

-(void)toSessionMgmtViewController
{
    TSessionMgmtViewController *tsmvc = [[TSessionMgmtViewController alloc] init];
    [[self navigationController] pushViewController:tsmvc animated:YES];
}

在 VC1 中:

- (IBAction)toCreateSessionView:(id)sender
{
    TCreateSession *cs = [[TCreateSession alloc] init];
    [[self navigationController] pushViewController:cs animated:YES];
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[self tableView] reloadData];
}

在 VC2 中: 完成与服务器的合作...

    UINavigationController *navControler = [self navigationController];
    [navControler popViewControllerAnimated:YES];

此外,当 VC2 完成与服务器的合作时,它会更新 TSession 的数据存储,称为 SessionListStore:

 - (TSession *)addSession:(NSString *)code withName:(NSString *) name qs:(int)qs
 {
     TSession *s = [[TSession alloc] initWithName:name code:code numberQuestions:qs];
     [_sessions setObject:s forKey:code];
     return s;
 }

其中 session 是 SessionListStore 中的 NSNutatbleDictionary。

非常感谢。

【问题讨论】:

    标签: objective-c uitableview uinavigationcontroller


    【解决方案1】:

    编辑:解决方案是从服务器调用的完成块触发 reloadData 调用。

    请检查这个答案,

    Popping ViewController doesn't call viewWillAppear when going back

    您是否将导航控制器添加到视图控制器或视图控制器到导航控制器?

    此外,您可以将所需的视图控制器设置为导航控制器的委托并实现此方法。

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    

    【讨论】:

    • 谢谢,虽然与那里提到的场景不同,我没有在 UINavigationController 中嵌套 UITabBarController。所以我相信我已经在做那个答案所暗示的事情了。没有调用 viewWillAppear 的任何其他原因?
    • 您是否查看了上述帖子中的此链接? davidebenini.it/2009/01/03/…
    • Ok Thx,所以帖子说“......如果你添加一个 UINavigationController 作为 UIViewController 子类的子视图,你必须显式调用它的 viewWillAppear”。但在我的项目中,导航控制器不是另一个 vc 的子类(参见上面新添加的应用程序委托代码)。我还是误会了什么吗?谢谢,
    • 在 VC1 的 viewWillAppear: 中添加一个断点并检查它是否被调用,我敢打赌。另外,您可以发布将数据添加到表格视图的代码吗?
    • 啊,是的,你是对的。我在 viewWillAppear 中添加了一个断点,它被调用了。但是 VC1 中的表格仍然没有显示新的单元格。然后,如果我执行 -->VC2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多