Передача 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)


arrow_upward
1
arrow_downward

Не размещайте 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

arrow_upward
1
arrow_downward

Во-первых, не создавайте и не размещайте другой экземпляр 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

arrow_upward
0
arrow_downward

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

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