Переданный массив не передается popViewControllerAnimated ... почему? - PullRequest
0 голосов
/ 03 мая 2011

Не откладывай на огромный вопрос ... (в основном это код).
Хорошо, у меня есть контроллер навигации, который содержит контроллер представления (называемый AddClaim), содержащий tableView. если выбрана ячейка, это называется:

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 (Это эксклюзивный список).

В ViewDidLoad окна EditClaimDetails этот код существует: (demandTypeHoldingArray - изменяемый массив, объявленный в файле заголовка)

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

self.navigationItem.leftBarButtonItem = backButton;

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

В основном результат такой, как и ожидалось: кнопка «Назад» отображается - при нажатии - она ​​вызывает селектор, переводящий контроллер представления в AddClaim, в requestTypeHoldingArray содержится newClaimsArray, указанный в AddClaim.

Это часть кода в didSelectRowAtIndexPath: (ApplicTypeArray - массив, содержащий текстовые метки ячеек)

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

Что это делает, так это то, что первый объект demandTypeHoldingArray заменяется тем, что было в TextLabel ячейки. Все идет нормально. (протестировано с помощью nslog)

Это код для нажатия кнопки возврата:

-(IBAction)pressedBack {

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

sender.newClaimArrayDetails = claimTypeHoldingArray;

[self.navigationController popViewControllerAnimated:YES];

Вот тут и начинается проблема ... Это действие (по моему мнению) должно заменить newClaimArrayDetails на demandTypeHoldingArray. (это так) Но , когда контроллер представления отключен, и экран возвращается, чтобы добавить утверждение, что этот массив не изменился! Что я сделал не так?! Кстати, все свойства установлены. это тест, который я делаю в viewDidAppear:

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

Ответы [ 2 ]

1 голос
/ 03 мая 2011

Этот ответ имеет тот же масштаб, что и вопрос, надеюсь, он не слишком велик;)

Таким образом, в вашем методе buttonBacked, вы пытаетесь обновить исходный объект контроллера представления AddClaim с помощью ApplicTypeHoldingArray.

Вы наполовину правы - вы определенно обновляете объект 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];

Вам необходимо передать в свой контроллер представления EditClaimDetails контроллер представления AddClaim, который его создал.

В вашей ячейке выбран методдобавить что-то вроде

detailViewController.addClaimViewController = self;

(где addClaimViewCOntroller - это свойство вашего объекта EditClaimDetails, например

@property (nonatomic, retain) Addclaim *addClaimViewController;

Затем ваш метод pressBack становится

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

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

Надеюсь, что это поможет.

0 голосов
/ 03 мая 2011

Проверьте определение свойства вашего массива в AddClaim, это случайно (неатомное, копирование)? Если да, то он будет содержать личную копию вашего массива, чтобы ваш исходный массив не мог измениться.

...