另一个新手问题:
我现在感觉很蠢。我已经很长时间没有使用 UI 文本输入了。这就是我到目前为止所拥有的。我有一个带有 subview 的 View 。我已经为 UITextFields 连接了 IBOutlet,并且已将文本字段连接回委托(delegate)的主视图 Controller 文件所有者(对此不确定)。我很高兴构建和运行。我输入一些文本,当我在文本字段之外单击时,我的键盘消失了。但是当我退出 View 时,我应该保存每个字段中的值。但是当我单步执行代码时,我的文本字段(不是文本,而是字段本身)全部为零。
所以,显然我在这里错过了重要的一步。
当用户单击关闭 subview 时,从主视图调用 saveUserSettings:
- (IBAction)closeButtonPressed:(UIButton *)sender {
[self.userSettingsView saveUserSettings];
[self dismissViewControllerAnimated:YES completion:nil];
}
迷幻的色彩帮助我在开发过程中看到它们。 :-)
所选 View 是 ScrollView ,但它也不滚动。那是另一个问题了。
这是 IDUtilityViewController 代码:
@interface IDUtilityViewController ()
@property (strong, nonatomic) IBOutlet IDAboutView *aboutView;
@property (strong, nonatomic) IBOutlet IDUserSettingsView *userSettingsView;
@property (strong, nonatomic) IBOutlet UIButton *aboutButton;
@property (strong, nonatomic) IBOutlet UIButton *userSettingsButton;
@end
@implementation IDUtilityViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.aboutView = [[IDAboutView alloc] init];
self.userSettingsView = [[IDUserSettingsView alloc] init];
[self userSettingsButtonPressed:self.userSettingsButton];
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideKeyboard)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
}
- (void)hideKeyboard
{
[self.userSettingsView saveUserSettings];
[self.view endEditing:YES];
}
#pragma mark - IBActions
- (IBAction)closeButtonPressed:(UIButton *)sender {
//[self.userSettingsView saveUserSettings];
[self dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)aboutButtonPressed:(UIButton *)sender {
self.userSettingsView.hidden = YES;
self.aboutView.hidden = NO;
}
- (IBAction)userSettingsButtonPressed:(UIButton *)sender {
self.aboutView.hidden = YES;
self.userSettingsView.hidden = NO;
}
这是 IDUserSettingsView.h:
@interface IDUserSettingsView : UIView
@property (nonatomic, strong) IBOutlet UITextField *userIDField;
@property (nonatomic, strong) IBOutlet UITextField *passwordField;
@property (nonatomic, strong) IBOutlet UITextField *ipAddressField;
@property (nonatomic, strong) IBOutlet UITextField *portNumberField;
@property (nonatomic, strong) IBOutlet UITextField *doorNameField;
@property (nonatomic, strong) IBOutlet UITextField *badgeNumberField;
- (void)saveUserSettings;
@end
这是 IDUserSettingsView.m:
#import "IDUserSettingsView.h"
@interface IDUserSettingsView()
@property (nonatomic, strong) NSUserDefaults *standardUserDefaults;
@end
@implementation IDUserSettingsView
@synthesize userIDField = _userIDField;
@synthesize passwordField = _passwordField;
@synthesize ipAddressField = _ipAddressField;
@synthesize portNumberField = _portNumberField;
@synthesize doorNameField = _doorNameField;
@synthesize badgeNumberField = _badgeNumberField;
NSMutableString *emptyString = @"";
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.standardUserDefaults = [NSUserDefaults standardUserDefaults];
}
return self;
}
- (void)saveUserSettings
{
[self.standardUserDefaults setObject:self.userIDField.text forKey:@"isonos_userID"];
[self.standardUserDefaults setObject:self.passwordField.text forKey:@"isonos_password"];
[self.standardUserDefaults setObject:self.ipAddressField.text forKey:@"isonos_ipAddress"];
[self.standardUserDefaults setObject:self.portNumberField.text forKey:@"isonos_portNumber"];
[self.standardUserDefaults setObject:self.doorNameField.text forKey:@"isonos_doorName"];
[self.standardUserDefaults setObject:self.badgeNumberField.text forKey:@"isonos_badgeNumber"];
}
- (UITextField *)userIDField {
return _userIDField;
}
- (void)setUserIDField:(UITextField *)userIDField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_userID"];
if (!result) result = emptyString;
_userIDField.text = [emptyString stringByAppendingString:result];
}
- (UITextField *)passwordField {
return _passwordField;
}
- (void)setPasswordField:(UITextField *)passwordField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_password"];
if (!result) result = emptyString;
_passwordField.text = [emptyString stringByAppendingString:result];
}
- (UITextField *)ipAddressField {
return _ipAddressField;
}
- (void)setIpAddressField:(UITextField *)ipAddressField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_ipAddress"];
if (!result) result = emptyString;
_ipAddressField.text = [emptyString stringByAppendingString:result];
}
- (UITextField *)portNumberField {
return _portNumberField;
}
- (void)setPortNumberField:(UITextField *)portNumberField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_portNumber"];
if (!result) result = emptyString;
_portNumberField.text = [emptyString stringByAppendingString:result];
}
- (UITextField *)doorNameField {
return _doorNameField;
}
- (void)setDoorNameField:(UITextField *)doorNameField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_doorName"];
if (!result) result = emptyString;
_doorNameField.text = [emptyString stringByAppendingString:result];
}
- (UITextField *)badgeNumberField {
return _badgeNumberField;
}
- (void)setBadgeNumberField:(UITextField *)badgeNumberField {
NSString *result = [self.standardUserDefaults stringForKey:@"isonos_badgeNumber"];
if (!result) result = emptyString;
_badgeNumberField.text = [emptyString stringByAppendingString:result];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
我什至尝试直接设置控件而不使用任何值:
#import "IDUserSettingsView.h"
@interface IDUserSettingsView()
@property (nonatomic, strong) NSUserDefaults *standardUserDefaults;
@end
@implementation IDUserSettingsView
@synthesize userIDField = _userIDField;
@synthesize passwordField = _passwordField;
@synthesize ipAddressField = _ipAddressField;
@synthesize portNumberField = _portNumberField;
@synthesize doorNameField = _doorNameField;
@synthesize badgeNumberField = _badgeNumberField;
NSMutableString *emptyString = @"";
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.standardUserDefaults = [NSUserDefaults standardUserDefaults];
}
return self;
}
- (void)saveUserSettings
{
[self.standardUserDefaults setObject:self.userIDField.text forKey:@"isonos_userID"];
[self.standardUserDefaults setObject:self.passwordField.text forKey:@"isonos_password"];
[self.standardUserDefaults setObject:self.ipAddressField.text forKey:@"isonos_ipAddress"];
[self.standardUserDefaults setObject:self.portNumberField.text forKey:@"isonos_portNumber"];
[self.standardUserDefaults setObject:self.doorNameField.text forKey:@"isonos_doorName"];
[self.standardUserDefaults setObject:self.badgeNumberField.text forKey:@"isonos_badgeNumber"];
}
- (UITextField *)userIDField {
return _userIDField;
}
- (void)setUserIDField:(UITextField *)userIDField {
_userIDField = userIDField; // breakpoint here
}
- (UITextField *)passwordField {
return _passwordField;
}
- (void)setPasswordField:(UITextField *)passwordField {
_passwordField = passwordField;
}
- (UITextField *)ipAddressField {
return _ipAddressField;
}
- (void)setIpAddressField:(UITextField *)ipAddressField {
_ipAddressField = ipAddressField;
}
- (UITextField *)portNumberField {
return _portNumberField;
}
- (void)setPortNumberField:(UITextField *)portNumberField {
_portNumberField = portNumberField;
}
- (UITextField *)doorNameField {
return _doorNameField;
}
- (void)setDoorNameField:(UITextField *)doorNameField {
_doorNameField = doorNameField;
}
- (UITextField *)badgeNumberField {
return _badgeNumberField;
}
- (void)setBadgeNumberField:(UITextField *)badgeNumberField {
_badgeNumberField = badgeNumberField;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
这是 View 层次结构:
最佳答案
如果您从主视图(而不是 IDUserSettingsView)调用“saveUserSettings
”,则 IDUserSettingsView 可能已关闭,并且所有 socket 连接都很长走了。
为什么不将更改的设置复制到某个结构中,该结构会发送/复制到您的主视图中,然后当用户选择更新他/她的设置时您可以调用“saveUserSettings
”?
或者,确保在 IDUserSettingsView 关闭之前调用“saveUserSettings
”(并且该 View 中的所有内容都会被拆除和/或释放) 'd)。
关于objective-c - Objective c - 键盘关闭后从 UITextfield 获取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070704/