#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, случайно ли оно (неатомное, копия)? Если да, то он будет содержать частную копию вашего массива, так что ваш исходный массив не сможет измениться.