Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c-在键盘关闭后从UITextfield获取文本_Objective C_Xcode_Interface Builder - Fatal编程技术网

Objective c 目标c-在键盘关闭后从UITextfield获取文本

Objective c 目标c-在键盘关闭后从UITextfield获取文本,objective-c,xcode,interface-builder,Objective C,Xcode,Interface Builder,另一个新手问题: 我现在觉得自己很笨。我已经很长时间没有使用UI文本输入了。这就是我到目前为止所做的。我有一个带有子视图的视图。我已经为UITextFields连接了我的IBOutlets,并且已经将文本字段连接回代理的主视图控制器文件所有者(对此不确定)。我快乐地建造和运行。我输入一些文本,当我在文本字段外单击时,我的键盘就消失了。但是当我退出视图时,我应该保存每个字段中的值。但是,当我逐步浏览代码时,我的文本字段(不是文本而是字段本身)都是零 所以,很明显我错过了一个重要的步骤 当用户

另一个新手问题:

我现在觉得自己很笨。我已经很长时间没有使用UI文本输入了。这就是我到目前为止所做的。我有一个带有子视图的视图。我已经为UITextFields连接了我的IBOutlets,并且已经将文本字段连接回代理的主视图控制器文件所有者(对此不确定)。我快乐地建造和运行。我输入一些文本,当我在文本字段外单击时,我的键盘就消失了。但是当我退出视图时,我应该保存每个字段中的值。但是,当我逐步浏览代码时,我的文本字段(不是文本而是字段本身)都是零

所以,很明显我错过了一个重要的步骤

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

- (IBAction)closeButtonPressed:(UIButton *)sender {
    [self.userSettingsView saveUserSettings];
    [self dismissViewControllerAnimated:YES completion:nil];
}
迷幻色彩帮助我在开发过程中看到它们。:-)

所选视图是滚动视图,但也不滚动。那是另一个问题

以下是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
以下是视图层次结构:


您可能弄乱了
IBOutlet
连接,我打赌它们没有连接或连接到错误的对象

尝试定义一个setter方法并在其上放置一个断点,以尝试找到它被设置的位置,或者可能被清除为
nil

- (void)setUserIDField:(UITextField *)field
{
    _userIDField = field; // breakpoint here
}
(注意:如果禁用了ARC,则需要保留新值并释放旧值)。

如果从主视图(而不是IDUserSettingsView)调用“
saveUserSettings
”,则IDUserSettingsView可能已关闭,并且所有插座连接都已断开

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


或者,确保在IDUserSettingsView解散之前调用“
saveUserSettings
(并且该视图中的所有内容都被删除和/或解除锁定)。

您从何处调用“
saveUserSettings
”方法?saveUserSettings究竟从何处调用?@HermannKlecker不要紧,如果他能够在调试器中单步执行,则会调用它。@MichaelDautermann-来自主视图上的closeButtonPressed iAction方法。我会为你们补充我的问题。@AbhiBeckert,这很重要。他们在Dealoc可能是零。如果在同一类的任何新实例上调用它们,它们可能为零——我们已经看到了很多这样的例子。如果在实例仍处于活动状态但视图已被破坏时从对象外部调用该方法,则它们可能为零。犯错误的机会很多。请看左侧线条旁边的填充圆圈。如果它们根本没有连接,那么圆圈是空的。他告诉ARC让它们成为强引用,所以即使视图消失,也不应该发布它?你看到了一些东西。我创建了一个虚拟项目,并将所有内容放在一个视图中,它成功了。我移动了saveUserSettings,以便在键盘关闭时执行。因此,我知道在IDUserSettingsView仍处于打开状态时会调用它。但我似乎没有指向文本字段的指针。这让我快发疯了。我正在发布一些代码。我感觉您可能有两个“
userSettingsView
”对象正在运行。如果将“`self.userSettingsView=[[IDUserSettingsView alloc]init];
”行从“
viewDidLoad`”方法中去掉,会发生什么情况?它仍然在故事板或XIB文件中定义,并且仍然设置为出口,对吗?