将数据从视图控制器传递到第一个详细控制器,然后传递到第二个详细控制器

时间:2013-08-26 02:53:56

标签: ios uiviewcontroller controller

在stackoverflow上发布我的第一个问题!希望我的问题很明确,这是......

我在第一视图控制器中嵌入了导航控制器,该控制器具有表格视图。从表格视图中我有一个推送到第一个细节控制器的segue。一切正常,segue将数据传递给First Detail Controller,但是我想再次从按钮推送到第二个细节控制器。

故事板中的布局如下Image of storyboard

我设置了第二个细节控制器并从第一个细节控制器上的按钮推送到第二个细节控制器。 但是,我无法弄清楚如何将数组中的数据传递给第二个细节控制器。我添加了一条NSLog行来查看传递的内容,调试面板输出“(null)

这是来自名为ColorBookViewController的.m First View Controller的viewdidload和segue代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    Color *color1 = [Color new];
    color1.name = @"Red";
    color1.hexnumber = @"FF0000";
    color1.spanishname =@"Rojo";

    Color *color2 = [Color new];
    color2.name = @"Green";
    color2.hexnumber = @"00FF00";
    color2.spanishname =@"Verde";


    Color *color3 = [Color new];
    color3.name = @"Blue";
    color3.hexnumber = @"0000FF";
    color3.spanishname = @"Azul";

    colors = [NSArray arrayWithObjects: color1,color2,color3, nil];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
   if ([segue.identifier isEqualToString:@"showColorDetail"]) {
       NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
       ColorDetailViewController *destViewController = segue.destinationViewController;
       destViewController.color = [colors objectAtIndex:indexPath.row];
       }
}

这是从名为ColorDetailController的第一个详细控制器的.m加载的视图:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"This is...%@", color.name);
    self.nameLabel.text = color.name;
    self.hexnumberLabel.text = color.hexnumber;
}

我的.h for SecondDetailController:

#import <UIKit/UIKit.h>
#import "Color.h"

@interface SecondDetailViewController : UIViewController

@property (nonatomic,weak) IBOutlet UILabel *spanishnameLabel;
@property (nonatomic, strong) Color *color;

@end

这是从名为SecondDetailController的第二个详细控制器的.m加载的视图:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = color.name;
    NSLog(@"This is...%@", color.spanishname);
    self.spanishnameLabel.text = color.spanishname;
}

应用程序在模拟器中运行正常,但我得到第二个细节控制器的空白屏幕,我从NSLog得到“空”结果(@“这是......%@”,color.spanishname); < / p>

有关为什么segue传递并保存第一个详细信息视图但不包含第二个详细信息视图的实例的任何建议?或者我错过了一些更基本的东西?我尝试在First Detail Controller上设置第二个segue,NSLog产生正确的结果(西班牙语的颜色名称),但我不知道如何将它传递给第二个细节控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showMoreDetail"]) {

        NSLog(@"This is... %@",color.spanishname);  //works fine
        self.spanishnameLabel.text = color.spanishname;  //throws error 
        }
}

感谢您的帮助或见解!

Download the complete project here

1 个答案:

答案 0 :(得分:0)

要将数据传递给第二个ViewController,只需执行与第一个ViewController中完全相同的操作:传递segue中Color对象的引用。

SecondDetailViewController中,您已经拥有了一个颜色属性。您只需使用Color中选择的ColorBookViewController对象设置此属性即可。由于您已在ColorDetailViewController中使用此引用,因此只需通过segue直接将其传递给SecondDetailViewController

ColorDetailViewController内:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"showMoreDetail"]) {
       SecondDetailViewController *destViewController = segue.destinationViewController;
       destViewController.color = self.color;
   }
}

现在,在viewDidLoad的{​​{1}}中,您可以正确设置标签,例如SecondDetailViewController