Переданный массив не передается popViewControllerAnimated … почему?

#objective-c #arrays #popviewcontroller

#objective-c #массивы #popviewcontroller

Вопрос:

Не пугайтесь огромного вопроса… (это в основном код).
Хорошо, у меня есть навигационный контроллер, который содержит контроллер представления (называемый 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 существует этот код: (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 содержит newClaimsArray, указанный в AddClaim.

Это часть кода в didSelectRowAtIndexPath: (claimTypeArray — это массив, который содержит текстовые метки ячеек)

 [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];
  

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

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

Ответ №1:

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

Итак, в вашем методе pressedBack button вы пытаетесь обновить исходный объект контроллера представления AddClaim с помощью claimTypeHoldingArray .

Вы наполовину правы — вы определенно обновляете объект 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, который его создал.

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

 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. Это кажется очень логичным и должно сработать, но я получаю эту ошибку там, где я размещаю объявление propery. ожидаемый спецификатор-квалификатор-список перед ‘Addclaim’

2. Или вам понадобится #import «AddClaim.h» где-нибудь ближе к началу. Эта ошибка означает, что он не знает, что такое AddClaim 🙂

Ответ №2:

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