2013-11-28 4 views
1

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

Я читал this entry here, и это меня не помогло. Что смешно, так как его ответ имеет около 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]; 
+0

MainViewController * mainViewController = [[MainViewController Alloc] инициализации]; –

+0

Как вы переходите от PreviewViewController к MainViewController? – Marcio

+0

Пожалуйста, покажите как код, который вы используете для «переключения макетов». Проблема может быть очень тривиальной: вы передаете значение одному экземпляру контроллера представлений и для отображения - вы используете другой экземпляр контроллера вида (например, тот, который создает segue для вас). – Ossir

ответ

1

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

- (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]; 
+0

Проблема в том, что я совершенно не знаком с объективом c. 'id' будет возвратным типом, верно? Но я не хочу что-то возвращать. Я хочу что-то сказать. Бьюсь об заклад, я полностью не понимаю ваш ответ, но, как я уже сказал, я новичок в объективе-c, я родом из андроида, и вещи там намного проще. : p – NewToObjectiveC

+0

Я обновил свой ответ, чтобы быть немного более основательным. В основном вы просто создадите собственный метод init в своем контроллере представления и вызовите это вместо суперклассов initWithNibName – cpjolicoeur

0

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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.identifier isEqualToString:@"yourSegueIndentifier"]){ 
     MainViewController *mvc = (MainViewController *) segue.destinationViewController; 
     mvc.userId = @"539897197";; 
    } 
} 
+0

Спасибо за ответ, но я не использую раскадровку. Я хочу, чтобы он был на 100% программным. – NewToObjectiveC

0
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 при представлении контроллера представления

-1

я попробовал и получил решение для передачи значения между 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]; 
+0

Пожалуйста, попробуйте добавить больше подробностей в свой ответ, потому что ответы, которые просто говорят, попробуйте, это совсем не очень хорошие ответы. – Popeye

+0

Пожалуйста, расскажите мне, почему я голосую за ответ. –

+0

Мой ответ правильный и попробуйте мой ответ. Если мой ответ не сработает, я соглашусь на голосование. Это работает совершенно правильно. –

0

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

Первый является пользовательский делегат

Во-вторых NSNotification

Здесь мы имеем два контроллера представления.

ViewController и SecondViewController

в SecondViewController

.h

#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

.h

#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 или пользовательский делегат для передачи данных от одного View Controller для другого View Controller

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

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

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

Очень важно, мы должны установить пользовательский делегат метода в Второй View Controller .because где мы отправляем данные в первый контроллер представления один раз кликаем кнопку Готово во втором контроллере представления.

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

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

Смежные вопросы