Frage

Another NEWBIE QUESTION:

I'm feeling pretty dumb right now. I haven't worked with UI text input for a very long time. So this is what I have so far. I have a view with a subview. I've wired up my IBOutlets for the UITextFields and I've wired the text fields back to the main view controller file owner for the delegate (not sure about that one). I happily build and run. I enter some text and when I click outside the text field my keyboard goes away. But when I exit my view I should be saving the values in each of the fields. But when I step through the code, my textfields (not the text but the fields themselves) are all nil.

enter image description here

enter image description here

enter image description here

So, obviously I've missed an important step here.

Calling saveUserSettings from the main view when user clicks to close the subview:

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

The psychedelic colors are helping me see them during development. :-)

The selected view is a scrollview but it's not scrolling either. That's a different issue.

enter image description here

Here is the IDUtilityViewController code:

@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;
}

Here is the 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

Here is the 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

I've even tried just setting the controls straight with no values:

#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

Here is the View Hierarchy:

enter image description here

War es hilfreich?

Lösung

If you're calling "saveUserSettings" from your main view (and not your IDUserSettingsView), then it's likely the IDUserSettingsView has dismissed and all the outlet connections are long gone.

Why not copy the changed settings into some structure that gets sent/copied into your main view which you can then call "saveUserSettings" on when the user chooses to update his/her settings?

Or, make certain "saveUserSettings" gets called before your IDUserSettingsView dismisses (and everything in that view gets torn down and/or dealloc'd).

Andere Tipps

You probably messed up the IBOutlet connections, I bet they're not connected or connected to the wrong objects.

Try defining a setter method and putting a breakpoint on it to try and find where it's being set or perhaps cleared to nil:

- (void)setUserIDField:(UITextField *)field
{
    _userIDField = field; // breakpoint here
}

(note: if you have ARC disabled you will need to retain the new value and release the old value).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top