Доступ к значению текстового поля из другого класса - PullRequest
1 голос
/ 12 ноября 2011

Я делаю приложение, используя шаблон служебного приложения. Я пытаюсь получить доступ к значению UITextField из класса FlipSideVewController.

В файле MainViewController.h у меня есть -

@interface MainViewController : UIViewController <UISplitViewControllerDelegate>{

UITextField *textField;
NSString *myText;
}

@property (retain, nonatomic) IBOutlet UITextField *textField;
@property (nonatomic, retain) NSString *myText;
-(IBAction)pressButton:(id)sender;

В файле MainViewController.m -

myText = [[NSString alloc] initWithFormat: textField.text];
NSLog(@"%@",myText);

Я создаю FlipSideViewController в классе MainViewController, используя следующий код -

FlipsideViewController *controller = [[[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil] autorelease];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

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

В классе FlipViewController у меня есть -

MainViewController *obj = [[MainViewController alloc] init ];
NSString *abc = obj.textField.text;  
NSLog(@"%@",abc);

Файл пера FlipSideVewController загружается без проблем. Однако консольный вывод (ноль) в FlipSideVewController.

Буду признателен за любую помощь.

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Если вы используете шаблон Utility Xcode, вы должны думать о MainViewController и FlipSideVewController как о заданных: среда создаст их для вас и сделает доступными для остальной части программы, как вы определите (либо в вашем коде)или в IB).Я имею в виду, что ваша строка:

MainViewController *obj = [[MainViewController alloc] init ];

на самом деле не делает то, что вы хотите.

В вашем случае вам кажется, что вам нужен доступ к текстовому полю, контролируемомусуществующий экземпляр MainViewController (тот, который правильно выводит NSLog) из другого существующего экземпляра FlipSideVewController.Это вопрос «соединения» каким-то образом этих двух контроллеров.

Есть несколько способов сделать это.Одним из них является определение «модели» для вашего приложения и распределение ее между контроллерами.См. Также шаблон Модель-Вид-Контроллер .Модель - это просто структура данных, которая содержит ваши «данные»;Вы делаете эту структуру данных доступной для обоих ваших контроллеров.Самый простой способ создать такую ​​структуру данных и предоставить к ней общий доступ - использовать синглтон (я не предлагаю использовать ее как лучший способ, просто отмечая, что это самый простой способ, IMO).

Другой, менее чистый способ - передать ссылку на MainViewController на FlipSideVewController, а затем получить доступ к текстовому полю через нее.Например, вы можете определить ivar в вашем FlipSideVewController, затем, когда создаются два контроллера, вы выполняете назначение для ivar.

1 голос
/ 12 ноября 2011

Вы должны перейти к своему MainViewController и сначала объявить ваш textField как свойство и синтезировать его, чтобы вы могли получить к нему доступ, используя obj.textField.И если вы только что создали obj с использованием alloc и init, у вас не будет текста в переменной экземпляра textField.

MainViewController.h

@property (retain) UITextField *textField;

MainViewController.m

@synthesize textField;

, и вы можете использовать

myText=textField.text;

Теперь это должно сделать это, и выможете получить доступ к этому textField с помощью obj.textField в вашем другом классе.Но вы все равно не получите его значение, если инициализируете его в другом классе, потому что вы будете создавать совершенно новый объект, текст которого textField.text будет пустым (если только вы не переопределили назначенный инициализатор для установки значения textField.text).

Объявление NSString * abc в качестве переменной экземпляра

NSString *abc;

, а затем в качестве свойства

@property (copy) NSString *abc;
@synthesize abc;

После создания FlipSideViewController,

controller.abc=myText;

Удалитькод, в котором вы создаете объект.Это сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...