ios 在 segue 期间将值传递到另一个视图

Posted

技术标签:

【中文标题】ios 在 segue 期间将值传递到另一个视图【英文标题】:ios pass values during a segue to another view 【发布时间】:2012-04-12 01:19:56 【问题描述】:

尝试做一些我在很多地方都看到过的事情,但似乎无法做到。我正在尝试在 segue 期间将数据从一个视图传递到另一个视图。

这是源视图中的 prepareForSegue 方法:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    //pass values
DetailViewController *dest = (DetailViewController *)[segue destinationViewController];

dest.locTitle = [value valueForKeyPath:@"title"];
dest.locInfo = [value valueForKeyPath:@"info"];



// NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);


如果我启用最后一个NSLog,我会看到正确的值...

这是目标视图的界面:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController



@property (strong, nonatomic) NSString *locTitle;
@property (strong, nonatomic) NSString *locInfo;
@property (weak, nonatomic) IBOutlet UILabel *detailMainText;
@property (weak, nonatomic) IBOutlet UILabel *detailTitle;

@end

...这是目标视图上的 viewDidLoad 和相关的@synthesize:

@synthesize detailMainText,detailTitle,locTitle,locInfo;

- (void)viewDidLoad

[super viewDidLoad];
NSLog(@"In viewDidLoad - the title is: %@ and the info is: %@",self.locTitle,self.locInfo);
detailTitle.text = locTitle;
detailMainText.text = locInfo;

NSLog 报告每个变量的 null 值。

如果您能给我任何帮助,我将不胜感激。我确定我在做一些愚蠢而明显的事情。

提前感谢您的帮助。


很久以后...


好的...我想我正在缩小范围。

我发现(违反直觉)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

之后

被调用
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

这很令人困惑,也让我的小计划无法确定我的 NSDictionary 数据源的哪一部分应该显示在我的详细视图中。目前我正在这样做:

// send info to detail view according to which row selected
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    //Get the selected object in order to fill out the detail view
    myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];


但由于这发生在 转场之后,它有点没用。如何在 prepareForSegue 方法中访问行号?

再次感谢。


...最后...


这是问题的答案:

如何在 prepareForSegue 方法中访问选定的行号?

希望有人会觉得它有用。

首先,在listView控制器的界面中为tableview设置一个IBOutlet

@property (weak, nonatomic) IBOutlet UITableView *tableView;

那么你的 prepareForSegue 可以这样做:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

if ([[segue identifier] isEqualToString: @"showDetail"]) 
    //pass values
    NSLog(@"The sender is %@",sender);

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    //Get the selected object in order to fill out the detail view
    id myValue = [myLocations objectForKey:[locationsIndex objectAtIndex:indexPath.row]];

    DetailViewController *dest = [segue destinationViewController];
    dest.locTitle = [myValue valueForKeyPath:@"title"];
    dest.locInfo = [myValue valueForKeyPath:@"info"];

    //NSLog(@"The title is: %@, and the info is: %@.",dest.locTitle,dest.locInfo);


【问题讨论】:

您在生命周期中是否有比 viewDidLoad 更早的东西 - loadView、initWithCoder 等?你的为 segue 准备的日志是否在 viewDidLoad 之前出现(例如,不是你的视图已经加载?)你在视图中看到的内容会出现在字符串属性中吗? 没有。我想我现在可能更接近了,但我正遭受“嵌套推送动画会导致导航栏损坏”的问题。 我在 xCode 4.2 (Snow Leopard) 中使用故事板。我有一个导航控制器,将 wo=ith 与我的列表控制器的 RootView 关系连接起来。我的列表控制器正在使用 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 来调用 [self performSegueWithIdentifier:@"showDetail" sender:self];故事板有一个从原型表单元到详细视图的推送序列,带有一个名为“显示详细信息”的标识符 - 该链中是否有一些不稳定的东西? 是的,也许!如果您有来自单元格的 segue,则无需从 didSelectRow 中“手动”调用它。您可能会调用两个 segues,并且会感到困惑。从 didSelectRow 中删除您的代码 - segue 仍在执行? 如果转场从一个视图控制器对象转到下一个,您将手动执行转场。如果它来自 UI 元素,那么它会在您点击该元素时自动执行。 【参考方案1】:

你可以这样做:首先在这里传递你想要发送到目标控制器的值:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
     [self performSegueWithIdentifier:@"segueToLocation" sender:the object you want to pass];

然后在这里获取对象

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString: @"segueToLocation"])     
         DetailViewController *dest = (DetailViewController *)[segue destinationViewController];
         //the sender is what you pass into the previous method
         dest.target=sender
    

【讨论】:

【参考方案2】:

您不需要创建目标视图控制器的本地实例变量。这将做同样的事情:

[segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"];
[segue.destinationViewController setLocInfo: [myValue valueForKeyPath:@"info"];

【讨论】:

【参考方案3】:

另一种选择 - 可以使用以下方法:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

在 prepareForSegue 之前触发。

【讨论】:

【参考方案4】:

你可以试试这个:

[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"title"]];
[[NSString alloc] initWithFormat:@"%@",
  [segue.destinationViewController setLocTitle: [myValue valueForKeyPath:@"info"]];

【讨论】:

【参考方案5】:

我想我也遇到了同样的问题,所以希望我的解决方案也能帮到你。它应该回答您问题的第一部分,或者至少会帮助其他人。

首先,您不能使用 SecondViewController 中的viewDidLoad 方法将传递的值分配给属性。这样做会得到 nil,因为 viewDidLoad 是在 Segue 之前实现的。

我不建议使用viewDidAppear,因为在加载视图后会更改值,因此可以直观地看到更改过程。

因此,最好的选择是将值直接分配给IBOutlet's。 如果你想传递一个字符串数组,你可以先分配一个你想加载的数组值,然后传递所有NSArray。这将允许您的视图已经加载了该值,并且您将可以使用其他值。

你也可以调用方法和传递数据。

【讨论】:

以上是关于ios 在 segue 期间将值传递到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

将值从一个视图控制器传递到另一个视图控制器的问题

iOS - 如何在通过手动 Segue 链接的两个视图控制器之间传递信息?

如何在视图控制器之间传递数据而不在 ios 中使用 segue?

使用 Segue 在 Swift 中将带有数据的对象从一个视图传递到另一个视图

尝试使用 segue 将数据从一个视图控制器传递到另一个视图控制器

关闭时将值传递给视图控制器时出错 |斯威夫特 5