Передача NSMutableArray из контроллера модального представления в родительское представление

Я изо всех сил пытаюсь передать массив NSMutable из контроллера модального представления обратно в контроллер представления, из которого я пришел.

Это мой текущий метод:

FirstViewController.h
#import "SecondViewController.h"

@property (strong, nonatomic) IBOutlet NSMutableArray *passedRecipientsArray;


FirstViewController.m
@synthesize passedRecipientsArray = _passedRecipientsArray;

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"passedRecipientsArray: %@", self.passedRecipientsArray);
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"addContact"]){
        UINavigationController *nav = [segue destinationViewController];
        SecondViewController *secondViewController = (SecondViewController *)nav.topViewController;
        secondViewController.emailContact = @"TRUE";
    }
}

SecondViewController.h
@property (strong, nonatomic) IBOutlet NSMutableArray *selectedContactsArray;


SecondViewController.m
@synthesize passedRecipientsArray = _passedRecipientsArray;

- (void)closeWindow
{
    if([self.selectedContactsArray count] != 0){
        NSLog(@"PASS ME: %@", self.selectedContactsArray);

        FirstViewController *firstViewController = [[FirstViewController alloc] init];

        if(firstViewController.passedRecipientsArray == nil) firstViewController.passedRecipientsArray = [[NSMutableArray alloc] init];
        firstViewController.passedRecipientsArray = self.selectedContactsArray;

        [self dismissModalViewControllerAnimated:YES];
    }
}

Есть ли лучший способ сделать это? Я пытался использовать это: Как передать объект при отклонении модального представления но сильно запутаться.

У кого-нибудь есть хороший учебник / простой способ сделать то, что мне нужно? Может ли кто-нибудь сказать мне, где я ошибаюсь?


person frddsgn    schedule 16.10.2012    source источник


Ответы (3)


Не размещайте FirstViewController внутри SecondViewController. Поскольку FirstViewController является вашим родительским классом. Старые объекты FirstViewController будут null после перераспределения.

Передайте экземпляр FirstViewController вместо записи

FirstViewController *firstViewController = [[FirstViewController alloc] init];

Пример:

SecondViewController.h

#import "FirstViewController.h"

FirstViewController *firstViewController;

@property (strong, nonatomic) IBOutlet NSMutableArray *selectedContactsArray;
@property (strong, nonatomic)  FirstViewController *firstViewController;

SecondViewController.m
@synthesize passedRecipientsArray = _passedRecipientsArray;
@synthesize firstViewController;

- (void)closeWindow
{
    if([self.selectedContactsArray count] != 0){          

                if(self.firstViewController.passedRecipientsArray == nil)
                       self.firstViewController.passedRecipientsArray = self.selectedContactsArray;         

        [self dismissModalViewControllerAnimated:YES];
    }
}

Затем измените свой FirstViewController как

SecondViewController *secondViewController;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"addContact"]){
        UINavigationController *nav = [segue destinationViewController];
        secondViewController = (SecondViewController *)nav.topViewController;
        secondViewController.emailContact = @"TRUE";
       secondViewController.firstViewController = self;
    }
}
person Shamsudheen TK    schedule 16.10.2012
comment
Теперь я получаю сообщение об ошибке @property (strong, nonatomic) FirstViewController *firstViewController;, говорящее: «Неизвестное имя типа FirstViewController» и «Свойство с сохраняемым (или сильным) атрибутом должно быть типом» - person frddsgn; 16.10.2012

Во-первых, не создавайте и не размещайте другой экземпляр firstViewController в secondViewController..вместо этого..создайте свойство FirstViewController *firstViewController во secondViewController, а затем синтезируйте его в файле secondViewController.m...

следуйте исправленному коду

FirstViewController.h
#import "SecondViewController.h"

@property (strong, nonatomic) IBOutlet NSMutableArray *passedRecipientsArray;


FirstViewController.m
@synthesize passedRecipientsArray = _passedRecipientsArray;

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"passedRecipientsArray: %@", self.passedRecipientsArray);
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"addContact"]){
        UINavigationController *nav = [segue destinationViewController];
        SecondViewController *secondViewController = (SecondViewController *)nav.topViewController;
        secondViewController.firstViewController = self;  // u should create firstViewController first in secondViewController class making it a property

        secondViewController.emailContact = @"TRUE";
    }
}

затем во второмViewController

     SecondViewController.h
@interface FirstViewController : UIViewController{
FirstViewController *firstViewController;
}
        @property (strong, nonatomic) IBOutlet NSMutableArray *selectedContactsArray;
        @property(nonatomic,strong) FirstViewController *firstViewController;
    SecondViewController.m
     @synthesize passedRecipientsArray = _passedRecipientsArray;
        @synthesize firstViewController
     - (void)closeWindow
            {
                if([self.selectedContactsArray count] != 0){
                    NSLog(@"PASS ME: %@", self.selectedContactsArray);



                if(firstViewController.passedRecipientsArray == nil)  {

                firstViewController.passedRecipientsArray = [[NSMutableArray alloc] init];
                firstViewController.passedRecipientsArray = self.selectedContactsArray;

                [self dismissModalViewControllerAnimated:YES];
            }
        }
    }
person AppleDelegate    schedule 16.10.2012

Мне просто интересно, почему бы вам не добавить протокол в представление модели? Вы можете установить NSMutableArray в представлении модели, а затем получить его из родительского представления.

person brianLikeApple    schedule 16.10.2012
comment
@DavidFord Я даю вам учебник по ссылке, просто следуйте ему. То, что я узнаю о протоколе, тоже отсюда. Как передать параметры из одного представления в другое - person brianLikeApple; 16.10.2012