0

有人能告诉我为什么我无法在视图控制器之间传递数据吗?

非常感谢任何帮助!

我从 NSMutableArray 获取对象,然后访问 placeId 属性。然后我希望将其传递给下一个视图控制器(BIDCCreateViewController),但我不能。Null 总是从下一个视图控制器记录下来。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    BIDDCCreateViewController *biddccCreateViewController = [[BIDDCCreateViewController alloc]init];
    BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row];
    biddccCreateViewController.placeId = tempObjStore.placeId;
    NSLog(@"tempObjStore in didselectrow: %@", tempObjStore.placeId);

}

#import <UIKit/UIKit.h>

@interface BIDDCCreateViewController : UIViewController
@property (strong, nonatomic) NSString *placeId;
@end

#import "BIDDCCreateViewController.h"

@implementation BIDDCCreateViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

我的输出来自日志如下:

2013-09-24 14:01:49.208 CouponLocation[827:a0b] tempObjStore in didselectrow: 1f068b8d2b6a13daf9be5eddee5cb32585b76377
2013-09-24 14:01:49.209 CouponLocation[827:a0b] SUCCESSFULLY PASSED PLACE ID: (null)

什么都没有通过。当我在 BIDCCCreateViewConroller 中设置字符串并记录它时,它工作正常。如您所见,我试图从中传递的视图控制器中的字符串很好。这在“didselectrow 中的 tempOjcStore”日志中得到了证明。所以那里有一个字符串,但它没有被传递,并且另一个视图控制器中的字符串似乎没有任何问题,因为我能够从内部更改它并记录。

不知何故,它没有被传输。

有什么建议么?

4

5 回答 5

2

您在错误的对象上设置了值:biddccCreateViewController对于您的方法是本地的,它不是稍后在触发 segue 时显示的控制器(或者您打开实际视图控制器的任何方法)。

不要将didSelectRowAtIndexPath代码放在prepareForSegue. 您可以从那里访问目标视图控制器,如下所示:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   if([segue.identifier isEqualToString:@"openDetails"]){
       UITableViewCell *cell = (UITableViewCell *) sender;
       NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
       BIDDCCreateViewController *biddccCreateViewController = (BIDDCCreateViewController*)segue.destinationViewController;
       BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row];
       biddccCreateViewController.placeId = tempObjStore.placeId;
   }
}

最后,显示值的正确位置placeIdviewWillAppear,而不是viewDidLoad,因为视图的加载发生在您可以placeId在控制器上设置之前。

于 2013-09-24T13:17:41.750 回答
1

我认为当您将 tempObjStore.placeId 的值从 BIDBusinessModel 传递到 BIDDCCreateViewController 时,可能是在打开 BIDDCCreateViewController 之前传递的值,这就是您在 BIDDCCreateViewController 中获得 NULL 值的原因。

按照示例代码

在 BIDDCCreateViewController

-(无效)ViewDidLoad

{ [self performSelector:@selector(getValue) withObject:self afterDelay:5.0 ];

}

-(无效)getValue

{

NSLog(@"成功通过的地点 ID:%@", self.placeId);

}

于 2013-09-26T09:28:07.030 回答
0

你在哪里推你的 BIDDCCreateViewController 视图?

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    BIDDCCreateViewController *biddccCreateViewController = [[BIDDCCreateViewController alloc]init];
    BIDBusinessModel *tempObjStore = [self.linkedBusinessParseModelArray objectAtIndex:indexPath.row];
    biddccCreateViewController.placeId = tempObjStore.placeId;
    NSLog(@"tempObjStore in didselectrow: %@", tempObjStore.placeId);


   [self.navigationController pushViewController:biddccCreateViewController];
}

然后你刷新你的视图控制器它会工作:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    // Do any additional setup after loading the view.
    NSLog(@"SUCCESSFULLY PASSED PLACE ID: %@", self.placeId);
}
于 2013-09-24T13:17:17.150 回答
0

您创建BIDDCCreateViewController为局部变量,但被推送到导航堆栈中的实际控制器可能是不同的。也许您正在为错误的对象设置属性。

于 2013-09-24T13:19:26.647 回答
0

当您在本地创建它时,您必须在 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中推送您的biddccCreateViewController。在此方法中添加一个推送视图控制器的步骤。

于 2013-09-24T13:22:02.887 回答