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

У меня есть три контроллера представления, один корневой контроллер, один контроллер представления входа в систему и один контроллер представления клиентов. Я хочу передать введенное имя пользователя и пароль в контроллере представления входа в контроллер представления клиента. Мои файлы и код показаны ниже. Не могли бы вы подсказать мне, как получить доступ к переменным, установленным в контроллере представления входа в систему? Или как я могу передать переменные контроллеру представления клиентов?

У меня есть эти файлы классов:

/classes/MySoftwareAppDelegate.h
/classes/MySoftwareAppDelegate.m
/classes/ViewController.h
/classes/ViewController.m
/classes/LoginController.h
/classes/LoginController.m
/classes/CustomersController.h
/classes/CustomersController.m

У меня такие взгляды:

/resources/MainWindow.xib
/resources/Login.xib
/resources/Customers.xib

В AppDelegate я успешно вставил вспомогательное представление «Вход», и оно отображается при каждом запуске приложения.

В окне входа в систему я ввожу свое имя пользователя и пароль, а затем нажимаю кнопку «Войти». При нажатии этой кнопки запускается IBAction. В этом IBAction я хочу изменить текущее представление с клиентами.

Вот код, который я использовал:

MySoftwareAppDelegate.h

#import <UIKit/UIKit.h>

@class ViewController;

@interface MySoftwareAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
 ViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ViewController *viewController;

@end

MySoftwareAppDelegate.m

#import "MySoftwareAppDelegate.h"
#import "ViewController.h"

@implementation MySoftwareAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after application launch
 [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
 [viewController release];
    [window release];
    [super dealloc];
}


@end

ViewController.h

#import <UIKit/UIKit.h>

@class LoginController;

@interface ViewController : UIViewController {
 LoginController *loginController;
}

@property (nonatomic, retain) LoginController *loginController;

@end

ViewController.m

#import "ViewController.h"
#import "LoginController.h"

@implementation ViewController

@synthesize loginController;

- (void)viewDidLoad {
 LoginController *tmpViewController = [[LoginController alloc] initWithNibName:@"Login" bundle:nil];

 self.loginController = tmpViewController;
 [self.view insertSubview:loginController.view atIndex:0];

 [tmpViewController release];

    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
 // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

 if (self.loginController.view.superview == nil) {
  self.loginController = nil;
 }

 // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;
}


- (void)dealloc {
 [loginController release];
    [super dealloc];
}

@end

LoginController.h

#import <UIKit/UIKit.h>

@class CustomersController;

@interface LoginController : UIViewController {
 UIButton *loginButton;
 UITextField *usernameTextField;
 UITextField *passwordTextField;
 NSMutableString *available_credits;
 NSString *current_xml_element;
 CustomersController *customersController;
}

@property (nonatomic, retain) IBOutlet UIButton *loginButton;
@property (nonatomic, retain) IBOutlet UITextField *usernameTextField;
@property (nonatomic, retain) IBOutlet UITextField *passwordTextField;
@property (nonatomic, retain) NSMutableString *available_credits;
@property (nonatomic, retain) NSString *current_xml_element;
@property (nonatomic, retain) CustomersController *customersController;

-(IBAction)textFieldDoneEditing:(id)sender;
-(IBAction)backgroundTap:(id)sender;
-(IBAction)loginToAccount:(id)sender;

@end

LoginController.m

#import "LoginController.h"
#import "CustomersController.h"

@implementation LoginController

@synthesize loginButton;
@synthesize usernameTextField;
@synthesize passwordTextField;
@synthesize customersController;

- (void)viewDidLoad {
 UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"];
 UIImage *stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];
 UIImage *buttonImagePressed = [UIImage imageNamed:@"blueButton.png"];
 UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 

 [loginButton setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal];
 [loginButton setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateHighlighted];
}

- (void)didReceiveMemoryWarning {
 // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning]; 
 // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;
}

- (void)dealloc {
 [usernameTextField release];
 [passwordTextField release];
    [super dealloc];
}

-(IBAction)textFieldDoneEditing:(id)sender {
 [sender resignFirstResponder];
}

-(IBAction)backgroundTap:(id)sender {
 [usernameTextField resignFirstResponder];
 [passwordTextField resignFirstResponder];
}

-(IBAction)loginToAccount:(id)sender {

 // bla bla bla... Login check process is done here

 CustomersController *tmpViewController = [[CustomersController alloc] initWithNibName:@"Customers" bundle:nil];
 self.customersController = tmpViewController;

 [self presentModalViewController:tmpViewController animated:YES];
 [self.view removeFromSuperview];

 [tmpViewController release];

}

@end

Как вы можете видеть выше, в методе loginToAccount LoginController.m я проверяю информацию для входа, а затем устанавливаю новый контроллер представления для вложенного представления «клиентов».

Затем я удаляю текущее подчиненное представление «Вход в систему» ​​из суперпредставления, но не знаю, как добавить новое подчиненное представление «Клиенты».

В MainWindow.xib у меня есть один контроллер представления, связанный с классом ViewController, и это корневой контроллер.

Любая помощь приветствуется. Поскольку я новичок в программировании Objective-C и iPhone, пожалуйста, постарайтесь объяснить, учитывая, что это начинающий программист :)

Еще раз спасибо.


person TamTam    schedule 15.10.2009    source источник


Ответы (3)


Я бы сказал, что лучший способ - иметь отдельный класс для хранения глобально необходимых данных (и это будет соответствовать модели MVC). Например, вы можете сохранить информацию для входа в свой MySoftwareAppDelegate, который легко доступен с помощью [[UIApplication sharedApplication] delegate] вызова из любой части вашего приложения.

person Vladimir    schedule 15.10.2009
comment
Спасибо, я пойду по этому пути. - person TamTam; 15.10.2009

Хорошо, позволь мне ответить на мой вопрос. Я только что нашел ответ на StackOverFlow.com

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

NextController *tmpViewController = [[NextController alloc] initWithNibName:@"NextView" bundle:nil];
tmpViewController.enteredUsername = usernameTextField.text;
tmpViewController.enteredPassword = passwordTextField.text;     
person TamTam    schedule 15.10.2009

Все зависит от того, насколько серьезные данные вы хотите ей передать. Для быстрой переменной (возможно, изменение настроек в контроллере модального представления) решение TamTam имеет наибольший смысл. Вы разместили / инициализировали его, у вас есть переменная, почему бы не получить доступ к ее свойствам? Тот же самый (представленный модально) контроллер представления может передавать переменные обратно через шаблон делегата.

Если ваши данные должны быть общесистемными, вы можете использовать одноэлементный шаблон. Использование «[[UIApplication sharedApplication] delegate]» позволяет получить делегирование приложения (которое является одноэлементным), и многие люди помещают туда свои переменные для удобства. Однако делегат вашего приложения не был предназначен для этого, и поэтому это считается плохим тоном. Создайте свой собственный синглтон, если ваше яблоко не работает по-быстрому.

Если вы используете постоянное хранилище данных, такое как sql, plists или coredata, вы можете поместить туда данные всей системы.

person autodidakto    schedule 10.06.2011