Передайте значение из одного 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

Переключение между UIViewControllers с UISegmentedControl

Отображение результатов API поиска iTunes с помощью RESTKit

Встроенные бинарники с iOS Framework

UIActivityViewController: Исключить расширения, не связанные с Apple?

Правильная обработка обновлений NSUbiquityKeyValueStore через устройства?

Открыть веб-страницу в полноэкранном режиме в Safari на iOS

Представление таблицы RxSwift с несколькими настраиваемыми типами ячеек

Кнопки поиска панели поиска ios не обновляют таблицу результатов

UIDatePicker ограничивает часы, но не дату

Как получить CGImageRef из контекстно-рисованных изображений?

После обновления до iOS 7 все виды в iOS 6 переместились вверх и скрыты на панели навигации

Развертывание развертывания для приложения с поддержкой расширения сети

Как сделать границу для сцены в SpriteKit

IBOutlet и viewDidUnload под ARC

Не удается показать основные данные в табличном представлении Swift

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