Обработка строковых объектов и контроллеров представления - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь передать строку назад и вперед между контроллерами представления, поэтому, например, как только я нажимаю кнопку панели вкладок (+) в первом представлении, открывается второе представление (PresentModalViewController), и оно имеет текст поле. Итак, все, что я печатаю, я беру в строку (эта строка является объектом первого представления) и пытаюсь добавить эту строку в табличное представление, загруженное в первом представлении.

Примечание: Мой строковый объект объявлен следующим образом

View1.h

NSString *string 

@property (copy) NSString *string;

View1.m

@synthesize string;

И в представлении 2 я передаю значение textField следующим образом

View2.m

View1 *view1 = [[View1 alloc] initWithNibName:@"View1" bundle:nil];
view1.string = [[NSString alloc] initWithFormat:@"%@", TextField.text];

Проблема - Когда я NSLog это значение внутри View2, он получает значение из текстового поля, но для того, чтобы загрузить предыдущий просмотр, мне нужно закрыть этот View2. Поэтому, как только этот View2 закрывается, когда я пытаюсь получить доступ к тому же строковому объекту в моем представлении 1. Он говорит, что строковый объект является нулевым.

Вопрос - Может ли кто-нибудь сказать мне
1. Как получить значение текстового поля из представления 2 в представление 1 после закрытия представления 2 (действительно ли все его объекты обнуляются при отклонении?)
2. Как добавить эту строку в последний индекс NSMutableArray?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Это очень хороший вопрос, который я тоже не мог понять, когда начал писать код для iOS.По сути, вам не нужно инициализировать новый view1, потому что контроллер табуляции уже содержит объект view1 в своем свойстве viewControllers.Кроме того, выделение / инициализация строки не требуется в этой ситуации.

Поэтому вы бы хотели изменить это:

View1 *view1 = [[View1 alloc] initWithNibName:@"View1" bundle:nil];
view1.string = [[NSString alloc] initWithFormat:@"%@", TextField.text];

На что-то вроде этого:

View1 *view1 = [self.tabbarController.viewControllers objectAtIndex:0];
view1.string = textField.text;

Или даже:

((View1 *)[self.tabbarController.viewControllers objectAtIndex:0]).string = textField.text;

Часть 2:

Как добавить эту строку в последний индекс NSMutableArray?

NSMutableArray *someArray = [[NSMutableArray alloc] init];
[someArray addObject:string];
[someArray addObject:@"anotherString"];
1 голос
/ 21 ноября 2011

Ответ от @chown определенно будет работать, если ViewController, которому вы отправляете строку, является базовым контроллером tabBarController.

Если вы были на нескольких уровнях вглубь стека NavigationController, то вам понадобится другой подход.

Подход, который я бы порекомендовал, состоял бы в создании protocol. Здесь вы создаете delegate view2, чтобы передать строку обратно в стек до того, как представление будет закрыто.

Существует множество примеров этого кода, как в документации Apple, так и в Интернете (включая StackOverflow), но вот быстрое завершение работы ...

В View2.h

#import <UIKit/UIKit.h>

//define the protocol, so  you can set the delegate to this type
@protocol View2Delegate;

@interface View2 : UIViewController

//other properties etc

@property (assign) id <View2Delegate> delegate;

@end

//put the actual protocol definition here so we can pass a reference to ourself back up too if needed...
@protocol View2Delegate

- (void)view2:(View2*)view passingStringBack:(NSString *)stringToPassBack;

@end

В View2.m вы можете вызывать этот метод делегата где угодно, но вот пример:

- (void)viewWillDisappear:(BOOL)animated
{
    if(self.delegate)
       [self.delegate view2:self passingStringBack:@"String I'm passing back"];

    [super viewWillDisappear:animated];
}

Тогда в View1.h

@interface View2 : UIViewController <View2Delegate>

и View1.m

- (void)view2:(View2*)view passingStringBack:(NSString *)stringToPassBack
{
    NSLog(@"%@", stringToPassBack);
}

Другим вариантом было бы опубликовать уведомление, но это скорее сценарий широковещания, чем целевое сообщение, поэтому я не буду публиковать пример кода для этого.

...