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

时间:2012-03-28 12:40:01

标签: ios segue uistoryboard

尝试做一些我见过很多地方记录的事情,但似乎无法管理。我试图在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);
}
}

5 个答案:

答案 0 :(得分:11)

您可以通过以下方式实现:首先将要发送的值传递到目标控制器:

- (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
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

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

在prepareForSegue之前发射。

答案 3 :(得分:1)

你可以试试这个:

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

答案 4 :(得分:1)

我认为我有完全相同的问题,所以希望我的解决方案也能为您提供帮助。它应该回答你问题的第一部分,或者至少会帮助其他人。

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

我不建议使用viewDidAppear,因为在加载视图后会更改值,这会使更改过程在视觉上可见。

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

您也可以调用方法并传递数据。