【问题标题】:Passing Data from a View Controller to a First Detail Controller and then to a Second Detail Controller将数据从视图控制器传递到第一个细节控制器,然后传递到第二个细节控制器
【发布时间】:2013-10-31 07:31:50
【问题描述】:

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

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

故事板中的布局看起来像这样Image of storyboard

我设置了第二个细节控制器并从第一个细节控制器上的按钮推到那个。 但是我不知道如何将数组中的数据传递给第二个细节控制器。我添加了一个 NSLog 行来查看正在传递的内容,并且调试面板正在输出“(null)

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

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

我的 SecondDetailController 的 .h:

#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(@"This is...%@", color.spanishname);

关于为什么 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

【问题讨论】:

  • 您将颜色数组中的对象传递给第二个 VC 中的 ColorColor 是什么?

标签: ios uiviewcontroller controller


【解决方案1】:

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

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

在你的ColorDetailViewController

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

现在,在SecondDetailViewControllerviewDidLoad 中,您将能够正确设置标签,就像在self.spanishnameLabel.text = color.spanishname; 中一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多