Передайте значение из одного ViewController в другое в Objective-C

Я довольно новичок в Objective-C, программировании. Единственное, с чем я сейчас ViewController – это передать значение с первого ViewController на следующий.

Я прочитал эту запись здесь, и это не помогло мне. Что смешно, так как его ответ имеет около 500 голосов, поэтому я должен быть проблемой. То, что я сделал, было следующим.

Я открыл свой PreviewViewController.m и добавил следующую строку #import "MainViewController.h" так как я хотел передать значение из PreviewViewController в `MainViewController. Затем, когда я переключаю макеты (которые успешно работают), я хочу передать значение.

 MainViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; mainViewController.userId = @"539897197"; 

Как вы можете видеть, я хочу передать userId. Для этого я также создал свойство в MainViewController.h

 @property ( nonatomic, strong ) NSString *userId; 

Теперь в моем MainViewController.m я хочу получить доступ к userId. Но когда я регистрирую его, консоль сообщает мне, что он равен null . Однако, когда я устанавливаю переменную прямо перед NSLog она работает, поэтому кажется, что проблема является проблемой.

Кроме того, в MainViewController.m меня есть следующая строка

 @synthesize userId = _userId; 

но даже когда я удалил эту строку и изменил NSLog на NSLog(@"%@",self.userId); эта же проблема возникла.

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

EDIT Вот как я переключаю макеты

 UIViewController *viewController = [[MainViewController alloc]init]; MainViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; mainViewController.userId = @"539897197"; [self presentViewController:viewController animated:YES completion:NULL]; 

5 Solutions collect form web for “Передайте значение из одного ViewController в другое в Objective-C”

Почему бы не создать пользовательский инициализатор и передать его таким образом? Что-то вроде

 - (id)initWithUserId:(NSString *)aUserId { self = [super initWithNibName:@"MainViewController" bundle:nil]; if (self) { self.userId = aUserId } return self; } 

Тогда вы можете просто сделать:

 MainViewController *mvc = [[MainViewController alloc] initWithUserId:@"1234"] [self presentViewController:mvc animated:YES completion:nil]; 

Если вы используете storyboard вы должны использовать метод prepareForSegue: для передачи данных между контроллерами представлений. Сначала создайте segue из вашего PreviewViewController в MainViewController , просто перетащите его из контроллера просмотра в следующий контроллер просмотра, чтобы создать segue. Используйте UINavigationController если вы используете push segue. Используйте этот метод для извлечения и передачи данных

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"yourSegueIndentifier"]){ MainViewController *mvc = (MainViewController *) segue.destinationViewController; mvc.userId = @"539897197";; } } 
 UIViewController *viewController = [[MainViewController alloc]init]; MainViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; mainViewController.userId = @"539897197"; [self presentViewController:mainViewController animated:YES completion:NULL]; 

используйте mainViewController, а не viewController при представлении контроллера вида

Здесь мы имеем два способа передачи данных.

Сначала это пользовательский делегат

Во-вторых, NSNotification

Здесь у нас есть два контроллера вида.

ViewController и SecondViewController

в SecondViewController

.час

 #import <UIKit/UIKit.h> @class SecondViewController; @protocol SecondViewControllerDelegate <NSObject> - (void)secondViewController:(SecondViewController *)secondViewController didEnterText:(NSString *)text; @end @interface SecondViewController : UIViewController @property (nonatomic, assign)id<SecondViewControllerDelegate> delegate; @property (nonatomic, strong) IBOutlet UITextField *nameTextField;//It must connect as outlet connection - (IBAction)doneButtonTapped:(id)sender; @end 

.m

 #import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } //Either use NSNotification or Delegate - (IBAction)doneButtonTapped:(id)sender; { //Use Notification [[NSNotificationCenter defaultCenter] postNotificationName:@"passingDataFromSecondViewToFirstView" object:self.nameTextField.text]; //OR Custom Delegate [self.delegate secondViewController:self didEnterText:self.nameTextField.text]; [self.navigationController popViewControllerAnimated:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } 

в ViewController

.час

 #import <UIKit/UIKit.h> #import "SecondViewController.h" @interface ViewController : UIViewController<SecondViewControllerDelegate> @property (nonatomic, strong) IBOutlet UILabel *labelName; //You must connect the label with outlet connection - (IBAction)gotoNextView:(id)sender; @end 

.m

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //addObserver here... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFromPreviousViewControllerNotificationReceived:) name:@"passingDataFromSecondViewToFirstView" object:nil]; // Do any additional setup after loading the view, typically from a nib. } //addObserver Method here.... - (void)textFromPreviousViewControllerNotificationReceived:(NSNotification *)notification { // set text to label... NSString *string = [notification object]; self.labelName.text = string; } - (IBAction)gotoNextView:(id)sender; { //If you use storyboard SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; //OR If you use XIB SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; secondViewController.delegate = self; [self.navigationController pushViewController:secondViewController animated:YES]; } //Calling custom delegate method - (void)secondViewController:(SecondViewController *)secondViewController didEnterText:(NSString *)text { self.labelName.text = text; //Getting the data and assign the data to label here. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } 

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

Сначала мы перемещаем представление с первого контроллера представления на контроллер второго представления.

После этого мы отправляем данные с контроллера второго вида на контроллер первого вида.

ПРИМЕЧАНИЕ. Вы можете использовать метод NSNotification или Custom Delegate для отправки данных из One View Controller в Other View Controller

Если вы используете NSNotification, вам нужно установить postNotificationName для получения данных в методе действия кнопки.

Затем вам нужно написать addObserver (отправку данных в требуемый View Controller) ViewController и вызвать метод addObserver в том же контроле View.

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

Очень важно установить метод пользовательского делегата во втором контроллере представления. Поэтому, когда мы отправляем данные для первого просмотра контроллера, как только мы нажимаем кнопку «Готово» во втором контроллере просмотра.

Наконец, мы должны вызвать метод пользовательского делегата в First View Controller , где мы получаем данные и присваиваем эти данные метке. Теперь вы можете просмотреть переданные данные с помощью пользовательского делегата.

Аналогично, вы можете отправить данные на другой контроллер представления с помощью пользовательских методов делегирования

Я попробовал и получил решение для передачи значения между viewcontroller.

 MainViewController *mainVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"MainViewController"]; mainVC.userId = @"539897197"; [self presentViewController:mainVC animated:YES completion:Nil]; 

или используя этот путь. Вы не используете раскадровку, используя следующий рабочий режим

 MainViewController *mainVC = [[MainViewController alloc] init]; mainVC.userId = @"539897197"; [self presentViewController:mainVC animated:YES completion:Nil]; 
Interesting Posts

UIView drawRect рисовать линии неправильной ширины

Ошибка массива из-за границы (исключение NSRangeException) в

Действие при нажатии маленькой поперечной кнопки UITextField

Документ или блог для: Покупка приложений и Monotouch

AVAssetReaderOutput copyNextSampleBuffer зависает при кодировании видео с аудио на устройстве

Модальный вид iOS 7 делает кнопки серыми (отключены)

Удаление <null> внутри NSMutableDictionary внутри NSMutableArray

FlyoutNavigation – iOS

UISplitViewController на универсальном приложении с раскадровки

iOS 9 – «попытка удалить и перезагрузить один и тот же путь индекса»

Как определить мой CSS для отображения «HelveticaNeue-Light» с использованием Pixate Framework?

Xcode говорит, что некоторые из моих стручков не являются PIE, это прекрасно?

Сделать UICollectionView масштабируемым?

Детский компонент NSDateComponents этой последней недели года

Установить UIView для NILL изнутри самого себя?

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.