无法在iOS中的MasterVC与DetailVC之间传递数据

无法在iOS中的MasterVC与DetailVC之间传递数据,ios,objective-c,Ios,Objective C,我正在尝试将数据(\u claimReportToDetailView)从viewDidLoad(属于MasterVC)传递到DetailVC。它总是null @interface LAMasterViewController () { NSArray *_claimReports; } - (void)viewDidLoad { [super viewDidLoad]; _claimReports = [[LADataModelController getSingl

我正在尝试将
数据(\u claimReportToDetailView)
viewDidLoad
(属于
MasterVC
)传递到
DetailVC
。它总是
null

@interface LAMasterViewController ()
{
    NSArray *_claimReports;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _claimReports = [[LADataModelController getSingleton] getClaimReportsOrderedByAccessedDate];
    LADetailViewController *detailViewController = [[LADetailViewController alloc] init];
    detailViewController.claimReportToDetailView = (LAClaimReport *)_claimReports[0];
    NSLog(@"claim%@",detailViewController.claimReportToDetailView); // captures here properly.
}

@interface LADetailViewController : UIViewController

@property(nonatomic ) LAClaimReport *claimReportToDetailView;

@end

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"sdfdf%@", _claimReportToDetailView); // logs null always.
}

您的
viewDidLoad
看起来很奇怪。你有这一行:

LADetailViewController *detailViewController = [[LADetailViewController alloc]init];
然而,您说视图控制器在故事板上

我认为现在发生的是,你正在创建这个VC,并设置它的属性,但是故事板正在加载一个全新的VC,你还没有为它设置属性


通常,您在故事板上向VCs传递信息的方式是使用
prepareforsgue:
方法。

这应该可以修复您的项目。试试看

//Allocating LADetailViewController instance
LADetailViewController *detailViewController = [[LADetailViewController alloc]init];

//Connecting it the specified VC on storyboard
detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourVCID"];

//Now the connection is set, so pass the data you need
detailViewController.claimReportToDetailView = (LAClaimReport *)_claimReports[0];

//Depending on present or push you should try one of the 2 lines
[self.navigationController pushViewController:detailViewController animated:YES];
//or
[self presentViewController:detailViewController animated:YES completion:nil];

您必须在主视图控制器中的prepareForSeque方法中将数据传递给详细视图控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) { //<-make shire the segue identifier match one in storyboard
        _claimReports = [[LADataModelController getSingleton] getClaimReportsOrderedByAccessedDate] ;
        LADetailViewController *vc = (LADetailViewController*)[sender destinationViewController];
        vc.claimReportToDetailView = (LAClaimReport *)_claimReports[0];
    }
}
-(void)prepareforsgue:(UIStoryboardSegue*)分段发送方:(id)发送方
{

if([[segue identifier]IsequalString:@“showDetail”]){/之所以会发生这种情况,是因为每当您从一个UIViewController导航到另一个UIViewController时,它都会再次初始化,因此,在执行导航时,请尝试在事件上设置值,并通过代码而不是segue进行导航。

是否可以显示将detailViewController添加到视图层次结构的代码在故事板上,Greg。detailVC正在打开properly@keshav不需要,这是对象属性的默认设置。我也会避免直接iVar访问而使用属性。例如,
self.claimReportToDetailView
,而不是
\u claimReportToDetailView
。甚至可以打开一个叮当声警告来标记这种访问。事实上,和
instantialeviewcontrollerwhidentifier
将用于访问视图控制器,以便设置要显示/编辑的数据。@特洛伊木马是的,但是主VC将负责显示详细VC。查看第一部分(我想遵循的方法)我在这里没有任何分段来传递数据。@LUI不想让我阅读你正在关注的一些随机博客文章,你可以用你试图遵循的方法的细节来更新你的问题。要清楚,视图没有设置在这里。虽然VC在这里实例化,但视图尚未加载。是的,你是对的,我想说的是c连接。问题更新,尽管它传递了数据,但DetailVC被推了两次,屏幕上的masterVC被DetailVC替换。只有当您使用detail VC连接segue master时才会发生这种情况。删除segue并以这种方式传递数据,或者尝试@greg Solution