【问题标题】:XCode - Navigation Controller Push Segue - Pass Data between Views and Skip Navigation SequenceXCode - 导航控制器推送 Segue - 在视图之间传递数据并跳过导航序列
【发布时间】:2013-11-11 11:59:06
【问题描述】:

关于这个故事板测试项目,我有 2 个问题。我是 Xcode 的新手,我找不到这个问题的解决方案。

This is Storyboard setup

视图控制器 A 是根视图控制器。视图 B 和视图 C 分别从它扩展而来。表视图从视图 C 扩展。视图 B 有 2 个按钮 - 到表视图和视图 B。 (我忘了在视图 B 上添加 textField,并从 B 转到 A)

1) Button To Table View 推动 Table View。表格单元格包含一个字符串。按下单元格,视图返回到视图控制器 C,并且该字符串显示在文本字段中。

问题 1:如果我使用表格视图中的模态 segue 来查看 C,textField 将使用方法 prepareForSegue 进行更新,但我将丢失视图 C 上的导航栏。

问题2:如果我使用push segue从表视图到视图C,视图C上的后退按钮不会指向视图A,而是指向表视图。

解决方案? 点击文本框选择它,然后按返回按钮更新视图C。但是如何实现呢?

或者有更好的解决方案吗?

2) 我想按视图 C 上的按钮转到视图 B。如果我使用 push segue,视图 B 后退按钮将指向视图 C。如果我使用模态推送,视图 B 会丢失导航栏。

我能否以某种方式将推送转至视图 B,它的后退按钮指向视图 A?

[编辑]

为了在视图控制器之间传递数据,我使用了 NSUserDefaults。事实证明,这是在视图之间传递简单数据(字符串、数字等)的非常有效的方式

将它用于 MODAL segue 很热吗?在所需的 tableViewController 中添加

-(void)tableview:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   //define user defaults
   NSUserDefaults *defaults = [NSUserDefaults standardDefaults];
   NSString *testString = @"test";
   [defaults setObject:testString] forKey:@"test1"];
   [defaults synchronize];

   //dismiss ViewController
   [self dismissViewControllerAnimated:YES completion:nil]; }

如果您希望使用 push segue 来关闭视图控制器并跳过导航序列(从序列中删除视图)替换

   [self dismissViewControllerAnimated:YES completion:nil];

   [self.navigationController popViewControllerAnimated:YES];

【问题讨论】:

  • 你能张贴图片的链接吗?
  • 我写了一个初步的答案,但我会在我们进行时清理它。
  • 帖子已编辑并添加链接:)
  • 哦好的导航控制器,而不是解雇你可以推送和弹出视图控制器。

标签: uinavigationcontroller storyboard uistoryboardsegue


【解决方案1】:

当我们解决每个问题时,我会更新这个答案。

如果您使用表格视图作为进行选择的一种方式,那么您应该关闭表格视图控制器而不是模态推送新视图。

//In the table view controller's on cell selected method
[self dismissViewControllerAnimated:YES completion:^{
    //code
}];

如果你想从视图 C 回到视图 A,推送视图将导致下一个视图被放置在顶部(如果你以模态方式呈现它)你可以使用上面相同的代码从 C 回到 A

基本上在这种情况下:

View A --modal-> View C --modal-> TableViewController

然后您必须在 TableViewController 中调用上述代码一次,然后在 ViewController C 中再次调用 然后返回 A

就让 B 指向 A 而言,如果您从 A 转到 B 会更容易。但是,如果您真的不需要从 A 转到 B,我建议您更改结构。

但是为了满足您的要求,切换视图层次结构的一种方法是关闭视图 C,同时将 B 推到 A 之上。

//Inside View C If you want it to happen only after the first animation completes just move the other line up into the block
[self dismissViewControllerAnimated:YES completion:^{
    //code
}];
[self.parentViewController.navigationController pushViewController:<#(UIViewController *)#> animated:YES];

我希望这会有所帮助。

【讨论】:

  • 谢谢。关闭视图控制器工作顺利。但是,我现在似乎无法在它们之间传递数据。在 tableViewController 中,我向 didSelectRowForIndexPath 添加了以下代码: FirstViewController * FVC = [[FirstViewController alloc] init]; NSIndexPath *indexPath2 = [MyTable indexPathForSelectedRow];
  • MyEntiti *someEntity = [entityList objectAtIndex:indexPath2.row]; FVC.self.passingString = someEntity.someString; [self dismissViewControllerAnimated:YES 完成:^(void){}]; NSLog(@"%@", FVC.self.passingString);在 FirstViewController 我添加了 -(void)viewWillAppear { self.label.text = self.passingString; NSLog 显示它选择了文本,但我无法让 FirstViewController 正确显示它
  • 您应该将其发布为编辑,以便更清晰地查看代码,(现在正在粘贴到代码编辑器中)
  • 我看到你有 FVC.self.passingString,我很确定 self 不是 FCV 的属性。尝试从您的语法中删除 self 。它应该主要用于代码的当前上下文。为了获得额外的保证,我会在 viewWillAppear:(BOOL)animated 中进行检查。
  • 再次感谢。我想出了用 NSUSerDefaults 传递数据的简单解决方案。诀窍是定义 NSUSerDefaults 并使用 completion:nil 关闭 ViewController :)
猜你喜欢
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2018-09-14
相关资源
最近更新 更多