Как обрабатывать несколько объектов с одним и тем же классом? - PullRequest
0 голосов
/ 06 сентября 2011

Я программно создал 2 UITextFeilds и 1 UIButton для представления приложения IOS при каждом вызове представления. UIButton вызывает функцию (метод) входа в систему, как я могу создать способ различать два UITextViews? Я программист JS, некоторые из тех же мыслей, есть ли способ получить объект по идентификатору? или получить все UITextFeilds разделить их как:

-(void)login{
Array *UITF[UITFself.view.UITextFeilds];
UITF[0].text;
}

Заранее спасибо

UITextField *uname = [[UITextField alloc] initWithFrame:CGRectMake(80.0, 100, 150.0, 30.0)];
[uname addTarget:self 
          action:@selector(textFieldDone:) 
    forControlEvents:UIControlEventEditingDidEndOnExit];  
uname.borderStyle = UITextBorderStyleRoundedRect;
uname.keyboardType = UITextAutocapitalizationTypeNone;
uname.returnKeyType = UIReturnKeyDone;
uname.autocorrectionType = UITextAutocorrectionTypeNo;
[self.view addSubview:uname];

-(void)login {
    //send login message
    NSString *u=uname.text;//user name text
    NSString *p=pass.text;//password text
    NSLog(u);
    NSLog(p);

}

Ответы [ 3 ]

1 голос
/ 06 сентября 2011

Храните переменные, которые вы используете для создания ваших UITextFields, как переменные экземпляра - или, лучше, как @property - в заголовке, а не как локальные переменные. Таким образом, вы можете получить к ним доступ из любой точки вашего класса.

.h:

@interface YourClass : UIViewController {

}
@property(nonatomic, retain) IBOutlet UITextField* nameField;
@property(nonatomic, retain) IBOutlet UITextField* passField;
@end

.m:

@implementation YourClass
@synthesize nameField, passField;
-(void)dealloc {
  self.nameField = nil; // release memory when your class is deallocated
  self.passField = nil; // release memory when your class is deallocated
  [super dealloc];
}

-(void)loadView {
    // here create your UITextFields programatically...
    self.nameField = [[[UITextField alloc] initWitHFrame:...] autorelease];
    ...
    self.passField = [[[UITextField alloc] initWitHFrame:...] autorelease];
    ...

    // or much more easier, you should create them using InterfaceBuilder,
    // this would save you a lot of code
}

-(IBAction)login {
   NSLog(@"name: %@ ; pass: %@", nameField.text, passField.text);
}
@end

К вашему сведению, обратите внимание, что если бы вы использовали InterfaceBuilder для создания интерфейса, у вас не возникло бы проблемы, поскольку у вас уже были бы IBOutlets, подключенные к вашим UITextFields (и вы бы сохранили весь код, необходимый для создания и настройки ваших UITextFields по коду).


Примечание: не используйте NSLog(stringVariable);, а вместо NSLog(@"%@",stringVariable);, потому что, если ваш stringVariable содержит буквенный '%', за которым следует любой символ спецификатора (например, в вашем случае, если текст введенный в ваше nameField и набранный пользователем, содержит «user% xyz»), ваш код не работает. Поэтому всегда используйте статически введенную литеральную строку в качестве первого параметра NSLog, а не переменную.

1 голос
/ 06 сентября 2011

Самое простое, что нужно сделать, это объявить UITextField s в заголовке:

UITextField *nameTextField;
UITextField *passTextField;

Затем использовать эти ссылки в реализации.

0 голосов
/ 06 сентября 2011

Объекты UIView имеют свойство NSInteger tag , которое может быть полезно в случае динамически создаваемых представлений.Установите значение во время создания и используйте viewWithTag: из любого из его родительских представлений.

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