popViewControllerAnimated没有传递传递的数组......为什么?

时间:2011-05-03 14:32:33

标签: objective-c arrays popviewcontroller

不要被这个大问题推迟......(主要是代码) 好的,我有一个导航控制器,它包含一个包含tableView的视图控制器(被调用的AddClaim)。 如果选择了一个单元格,则称为:

EditClaimDetails *detailViewController = [[[EditClaimDetails alloc] init] autorelease];

// Pass the selected object to the new view controller.
detailViewController.selectedIndexPath = indexPath;
detailViewController.newClaimArrayDetails2 = newClaimArrayDetails;
[self.navigationController pushViewController:detailViewController animated:YES ];

这很好用,并且显示了一个包含tableView的新视图控制器(它是一个独占列表)。

在EditClaimDetails的ViewDidLoad中,此代码存在:(claimTypeHoldingArray是在头文件中声明的可变数组)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"    style:UIBarButtonItemStyleBordered target:self action:@selector(pressedBack)];

self.navigationItem.leftBarButtonItem = backButton;

claimTypeHoldingArray = [[NSMutableArray alloc] initWithArray:newClaimArrayDetails2];

基本上结果是预期的:显示了一个后退按钮 - 按下时 - 它调用一个选择器弹出视图控制器到AddClaim,claimTypeHoldingArray包含AddClaim中给出的newClaimsArray。

这是didSelectRowAtIndexPath中代码的一部分:(claimTypeArray是保存单元格的textLabel的数组)

[claimTypeHoldingArray replaceObjectAtIndex:0 withObject:[claimTypeArray objectAtIndex:indexPath.row]];

这样做的是,claimTypeHoldingArray的第一个对象被替换为单元格的TextLabel上的文本。到现在为止还挺好。 (使用nslog测试)

这是按下后退按钮时的代码:

-(IBAction)pressedBack {

AddClaim *sender = [[[AddClaim alloc] init] autorelease];

sender.newClaimArrayDetails = claimTypeHoldingArray;

[self.navigationController popViewControllerAnimated:YES];

这就是麻烦开始的地方...... 这个动作(据我所知)应该用claimTypeHoldingArray替换newClaimArrayDetails。 (确实如此)但是当弹出视图控制器并且屏幕移回添加声明时,此数组不会更改! 我做错了什么?!顺便说一句,所有属性都设置好了。 这是我在viewDidAppear中做的测试:

NSLog(@"%@",[newClaimArrayDetails objectAtIndex:0]);

2 个答案:

答案 0 :(得分:1)

这个答案与问题的规模相同,希望它不是太大;)

因此,在您的pressedBack按钮方法中,您尝试使用claimTypeHoldingArray更新初始的AddClaim视图控制器对象。

你正好一半 - 你肯定是在更新AddClaim对象,而不是导航控制器内的对象。你正在创建一个新的并更新它!

-(IBAction)pressedBack {
    // This line creates a new AddClaim view controller
    AddClaim *sender = [[[AddClaim alloc] init] autorelease];

    // This line updates your _new_ AddClaim view controller
    sender.newClaimArrayDetails = claimTypeHoldingArray;

    // This line displays the _old_ AddClaim object
    [self.navigationController popViewControllerAnimated:YES];

您需要将创建它的AddClaim视图控制器传递给EditClaimDetails视图控制器。

在您的单元格中选择方法添加类似

的内容
detailViewController.addClaimViewController = self;

(其中addClaimViewCOntroller是EditClaimDetails对象的属性,如

@property (nonatomic, retain) Addclaim *addClaimViewController;

然后,您的pressedBack方法变为

-(IBAction)pressedBack {
    // This line updates your _old_ AddClaim view controller
    addClaimViewController.newClaimArrayDetails = claimTypeHoldingArray;

    // This line displays the _old_ AddClaim object
    [self.navigationController popViewControllerAnimated:YES];

希望有所帮助。

答案 1 :(得分:0)

检查AddClaim中的数组属性定义,是否有机会(非原子,复制)?如果是,它将保存您的数组的私有副本,以便原始数组无法更改。