objective-c - Objective c - 键盘关闭后从 UITextfield 获取文本

标签 objective-c xcode interface-builder

另一个新手问题:

我现在感觉很蠢。我已经很长时间没有使用 UI 文本输入了。这就是我到目前为止所拥有的。我有一个带有 subview 的 View 。我已经为 UITextFields 连接了 IBOutlet,并且已将文本字段连接回委托(delegate)的主视图 Controller 文件所有者(对此不确定)。我很高兴构建和运行。我输入一些文本,当我在文本字段之外单击时,我的键盘消失了。但是当我退出 View 时,我应该保存每个字段中的值。但是当我单步执行代码时,我的文本字段(不是文本,而是字段本身)全部为零。

enter image description here

enter image description here

enter image description here

所以,显然我在这里错过了重要的一步。

当用户单击关闭 subview 时,从主视图调用 saveUserSettings:

- (IBAction)closeButtonPressed:(UIButton *)sender {
    [self.userSettingsView saveUserSettings];
    [self dismissViewControllerAnimated:YES completion:nil];
}

迷幻的色彩帮助我在开发过程中看到它们。 :-)

所选 View 是 ScrollView ,但它也不滚动。那是另一个问题了。

enter image description here

这是 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 层次结构:

enter image description here

最佳答案

如果您从主视图(而不是 IDUserSettingsView)调用“saveUserSettings”,则 IDUserSettingsView 可能已关闭,并且所有 socket 连接都很长走了。

为什么不将更改的设置复制到某个结构中,该结构会发送/复制到您的主视图中,然后当用户选择更新他/她的设置时您可以调用“saveUserSettings”?

或者,确保在 IDUserSettingsView 关闭之前调用“saveUserSettings”(并且该 View 中的所有内容都会被拆除和/或释放) 'd)。

关于objective-c - Objective c - 键盘关闭后从 UITextfield 获取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070704/

相关文章:

objective-c - 如何在 objective-c 中使用分数进行计算

ios - restoreCompletedTransactions 并要求登录

ios - 类中的 Swift 4 Viewcontroller 依赖注入(inject)

ios - 界面生成器不会拉伸(stretch)自定义 View 的 subview

objective-c - "-Weverything"在每个 NSAssert 处发出 "Varargs argument missing, but tolerated as an extension"警告

objective-c - 在 Swift 项目中使用 Philips-Hue Obj-C

xcode - IOS 7.0.3升级后无法升级Xcode应用程序崩溃

ios - 应用程序在升级到 Xcode 7 后被 UIKit 卡住

ios - 在 Interface Builder 中使用通用类作为自定义 View

ios - iOS 7完整的UINavigationBar透明度