2014-12-12 7 views
0

Я пытаюсь сделать следующее и не в состоянии найти прямой ответ .. Это связано с этим: Passing uitextfield from one view to another. Но не совсем.ios Передача TextView от PushView до PresentingView

У меня есть Firstview.m, из которого я нажимаю Secondview.m. У Secondview.m есть UITextView. Я разрешаю пользователю редактировать UITextView на Secondview.m. Теперь я хочу сохранить это текстовое значение в переменной в Firstview.m. Один из способов сделать это заключается в следующем

в Firstview.h

@property (nonatomic) Secondview *secondView; 

То есть держать переменную secondView в самой FirstView. Но это не кажется эффективным. В идеале у меня должно быть только 1 текстовое поле NSString в FirstView. Каков правильный способ сделать это? Спасибо

ответ

3

Вы можете добиться этого, используя делегацию в Objective-C.

В вашем SecondView.h оного следующий сразу после заголовка включения

@protocol YourDelegateName <NSObject> 
    -(void)setText:(NSString *)strData; 
@end 

добавить делегирует свойство в ваш заголовок для доступа к ним в вызывающем классе, как показано ниже (Это идет с другими свойствами декларации в SecondView.h файле):

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

Теперь придет делегирование делегата. Скажем, вы хотите сохранить текстовое значение UITextView из SeconView в strTextViewData из FirstView класса, когда происходит следующее событие:

- (IBAction)save:(id)sender 
{ 
    [self.delegate setText:self.txtView.text]; // Assuming txtView is name for UITextView object 
} 

Теперь, в FirstView.h добавить YourDelegateName в списке делегатов, как показано ниже:

@interface FisrtView : ViewController <YourDelegateName> 
    @property (nonatomic, reatin) NSString *strTextViewData; 
@end 

И затем в файле FisrtView.m при создании экземпляра SecondView класс, установите делегат на self, как показано ниже:

SecondView *obj = [[SecondView alloc] initWithNibName:@"SeconView" bundle:nil]; 
obj.delegate = self; // THIS IS THE IMPORTANT PART. DON'T MISS THIS. 

Теперь Реализуйте метод делегата:

-(void)setText:(NSString *)strData 
{ 
    self.strTextViewData = strData; 
} 

Применяя это к вашему коду будет делать то, что вы хотите. Кроме того, Делегирование является одной из важнейших особенностей языка Objective-C, которая - делая это - вы узнаете.

Дайте мне знать, если у вас возникнут какие-либо проблемы с этой реализацией.

+1

Некоторое объяснение о Делегате было бы замечательным в ответе, так как этот ответ охватывал тему минимальным кодом. – viral

+0

@richa Большое спасибо. Это объяснение действительно полезно, и делегаты - это правильная вещь, чтобы узнать для меня здесь. Когда я выполнил код, который вы дали, я получаю следующую ошибку. 'Thread 1: EXC_BAD_ACCESS (code = 2, address = 0x27c7ff4) ' Я абсолютно не понимаю, что это значит. Я пропустил что-то очевидное здесь? Благодаря! –

+0

Единственное различие в моем коде и то, что вы дали, это то, что я создаю SecondView с помощью Storyboard следующим образом. 'UIStoryboard * story = [UIStoryboard storyboardWithName: @" Main "bundle: nil];' 'SecondView * sView = [story instantiateViewControllerWithIdentifier: @" SecondView "]; ' –