Intereting Posts
Скомпилируйте ошибки с помощью segment.io после обновления Xcode 5.1 UICollectionViewCell получает доступ к его родительскому UICollectionViewController Видеоролики приложения Cordova не воспроизводятся на iOS10 – ошибка 401 Можно ли управлять режимом баланса белого при запуске приложения для камеры? (ИОС) Как продолжить drawRect: при нажатии на экран Swift UIAlertController с пользовательским сообщением Проблемы с добавлением каркаса основного сюжета с существующим проектом в Workspace Несколько экземпляров того же UIButton? Обновление UIViewController после отклонения модального Segue Путаница с технической терминологией между потоком и очередью Перенос локальной базы данных sqlite на удаленный сервер ios 5 Как сохранить рамку UIScrollView при входе на передний план? Неожиданный EOF при поиске контактов в iPhone 6s UITextView в UITableView, Smooth Expand с помощью AutoLayout Что такое __NSCFData и как оно относится к NSData?

Добавление объектов в массив из другого контроллера View

У меня есть HomeViewController который имеет tableView, заполненный массивом tableViewArray (изначально пустым). Когда я нажимаю на barButton, я перехожу к другому контроллеру View, называемому OutsideViewController который имеет другой tableView, заполненный другим массивом.

Я хотел бы сделать следующее:

Когда я OutsideViewController на строку в OutsideViewController , я хотел бы добавить выбранное строковое значение в tableViewArray чтобы при возврате в HomeViewController у tableView появился новый элемент, указанный в таблицеView.

Пока это то, что я пробовал:

В методе -didSelectRowAtIndexPath моего OutsideViewController.m меня есть эта часть кода:

 NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; NSMutableArray *temporaryArray = [NSMutableArray arrayWithObject:selectedRow]; HomeViewController *homeVC = [[HomeViewController alloc] init]; homeVC.tableViewArray = temporaryArray; 

Этот код работает, но tableView в HomeViewController все еще пуст, когда я возвращаюсь. Нужно ли перезагружать данные tableView? Правильно ли я это делаю?

Вот как я установил свои контроллеры просмотра в Storyboard:

 HomeViewController -(modal segue)-> Navigation Controller --> OutsideViewController 

Кроме того, возврат из OutsideViewController в HomeViewController выполняется с помощью этой строки кода:

 [self dismissViewControllerAnimated:YES completion:^{ }]; 

То, что вы делаете неправильно, – это выделение нового HomeViewController . То, что я сделаю, это keeep ссылку на ваш HomeViewController в вашем OutsideViewController . Вот как.

Во-первых, в OutsideViewController.h создайте свойство, например:

 @property (nonatomic, weak) HomeViewController *homeVC; 

Не забудьте добавить @class HomeViewController; в ваших .h и #import "HomeViewController.h" в вашем .m

В HomeViewController реализуем метод prepareForSegue: вроде этого (замените ModalSegueIdentifier своим идентификатором segue ):

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"ModalSegueIdentifier"]) { OutsideViewController *modalVC = (OutsideViewController*)segue.destinationViewController; modalVC.homeVC = self; } } 

Затем, в OutsideViewController.m , вместо выполнения:

 HomeViewController *homeVC = [[HomeViewController alloc] init]; homeVC.tableViewArray = temporaryArray; 

Сделай это :

 _homeVC.tableViewArray = temporaryArray; 

Когда вы оставите свой модальный VC, ваш HomeVC будет иметь правильный массив. Не забудьте обновить UITableView !

NB: Конечно, есть много других способов, и это, возможно, не самый лучший. Но все-таки это должно сработать.

Это можно сделать и с помощью делегирования. Вам необходимо создать протокол в OutsideViewController с помощью метода, который отвечает за отправку нового объекта в HomeViewController . Сделайте это в OutsideViewController.h:

 @protocol OutsideViewDelegate <NSObject> - (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object; @end 

В файле реализации вам нужно немного didSelectRowAtIndexPath: метод didSelectRowAtIndexPath: ::

 NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; [self.delegate OutsideViewController:self didAddObject:selectedRow]; 

В вашем HomeViewController.h вы должны сделать свой класс соответствующим протоколу:

 @interface HomeViewController : UIViewController <OutsideViewDelegate> 

Затем создайте свойство для делегата:

 @property (nonatomic, weak) id <OutsideViewDelegate> delegate; 

Чтобы завершить процесс, выполните этот протокол в HomeViewController.m, чтобы получить новый объект из OutsideViewController:

 - (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object { if (object != nil) { [self.tableViewArray addObject:object]; } [self dismissViewControllerAnimated:YES completion:nil]; } 

Код выше зависит от того, tableViewArray ли ваш объект tableViewArray или нет. Если это не так, вы можете изменить тип аргумента объекта в методе протокола на объект inmutable array и просто назначить tableViewArray для нового массива.

РЕДАКТИРОВАТЬ:

В prepareForSegue: не забудьте установить делегат:

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"SEGUE_IDENTIFIER"]) { OutsideViewController *outsideVC = (OutsideViewController *)[segue destinationViewController]; [outsideVC setDelegate:self]; } } 

Прежде всего убедитесь, что вы alloc , tableViewArray свой tableViewArray в HomeViewController

Во-вторых, в этой строке

 HomeViewController *homeVC = [[HomeViewController alloc] init] 

вы создаете новую ссылку на свой HomeViewController что неверно, вам нужно передать правильную ссылку, возможно, создав переменную HomeViewController в OutsideViewController

Несмотря на то, что вы правильно делаете первое и второе предложение, вы все равно увидите пустой столбец, потому что вы не перезагружаете tableview, так или иначе вам нужно запустить [self.tableview reloadData]; метод.

Это значит; вам необходимо изучить шаблон Delegate или NSNotifications для связи между сценариями child- > parent

Как настроить простой делегат для связи между двумя контроллерами представлений?

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter/

Для вашего вопроса просто создайте делегата в своей Outside ; в вашем OutsideViewController.h

 #import <UIKit/UIKit.h> @protocol OutsideDelegate; @interface{}//bunch of interface stuff // Declare a property for the delegate @property (weak) id <OutsideDelegate> delegate; @end // Protocol Header @protocol OutsideDelegate <NSObject> @optional - (void)dismissPop:(NSMutableArray *)list; @end 

в вашем OutsideViewController.m

 @synthesize delegate; //run delegate method [delegate dismissPop:temporaryArray]; [self dismissViewControllerAnimated:YES completion:^{ }]; 

в вашем HomeViewController.h

 #import "OutsideViewController.h" @interface OutsideViewController : UITableViewController<OutsideDelegate> {} @property (strong, nonatomic) OutsideViewController *pvc; 

в вашем HomeViewController.m

 @synthesize pvc; -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"your segue"]) { pvc = [segue destinationViewController]; [pvc setDelegate:self]; } } // delegate callback function - (void)dismissPop:(NSMutableArray *)list { self.tableViewArray=list; [self.tableView reloadData]; } 

Другое решение

Измените свой стек поиска на это:

 Navigation Controller --> HomeViewController -(push segue)--> OutsideViewController 

и применить ответ rdurand

и добавьте это в свой HomeViewController:

 -(void)viewDidAppear:(BOOL)animated { [self.tableview reloadData]; } 

В этом решении, поскольку вы просто push-pop viewcontrollers в стеке viewDidAppear будет вызываться в HomeViewController каждый раз, когда вы выпадаете OutsideViewController.