Восстановление нескольких текстовых полей и меток в одном контроллере представления

У меня есть контроллер представления, содержащий 2 текстовых поля, 2 сегментированных элемента управления и несколько меток, которые отображают метки времени, установленные пользователем с помощью UIButtons. Я хотел бы иметь возможность восстанавливать любые пользовательские значения для этих элементов при выходе / перезапуске, а также при возврате в мое главное меню view controller, которое является navigation controller. Используя следующий код, я могу восстановить одно из текстовых полей в фоновом режиме/завершении/перезагрузке, но я не уверен, как это сделать для другого текстового поля или меток меток времени и сегментированных элементов управления. Я попытался продублировать код восстановления с изменениями имени текстового поля и строки @"UnsavedText", но безуспешно.

Кроме того, всякий раз, когда я возвращаюсь в главное меню с помощью кнопки «Назад» на панели навигации, я теряю все свои данные из всех полей.

Вот код в моем делегате, выбирающий восстановление состояния:

// Sets RESTORATION
-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
    return YES;
}

-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
    return YES;
}

Вот соответствующий код в моем контроллере представления для восстановления одного текстового поля. Я включаю свой код viewDidLoad с инициализацией состояния на случай, если это каким-то образом является частью проблемы:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // Updates time on currentTimeLabel
    [self updateTime];

    // Sets initial button states
    [self setInitialState];

    // Sets UITextField delegate
    self.startLevel.delegate = self;
    self.stopLevel.delegate = self;
    // initializes basic values for segmented controls
    bigTank = YES;
    startFractions = @"";
    stopFractions = @"";


}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// Restoration of text fields
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    // start level text
    [coder encodeObject:_startLevel.text forKey:@"UnsavedText"];
    [super encodeRestorableStateWithCoder:coder];

}

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
    // start level text
    _startLevel.text = [coder decodeObjectForKey:@"UnsavedText"];
    [super decodeRestorableStateWithCoder:coder];

}



// Sets initial button and label states
- (void)setInitialState
{
    self.start.enabled = YES;
    self.stop.enabled = NO;
    self.calculate.enabled = NO;
    self.resume.enabled = NO;

    // Text for time labels reset
    _startTimeLabel.text = @"- -:- -:- -.- -";
    _stopTimeLabel.text = @"- -:- -:- -.- -";

    // Resets the minuteRateLabel
    _minuteRateLabel.text = @"--.--";

    // Resets the text fields to their initial state with the placeholder "inches" text
    [_startLevel setText:nil];
    [_stopLevel setText:nil];

    // Resets inch levels to EVEN
    [self.startFractionControl setSelectedSegmentIndex:0];
    [self.stopFractionControl setSelectedSegmentIndex:0];
    startFractions = @"";
    stopFractions = @"";
}

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

РЕДАКТИРОВАТЬ:

Это код, который я пробовал в соответствии с предложением:

Мое нажатие кнопки должно якобы сохранить значение метки времени:

- (IBAction)startButton:(UIButton *)sender
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"hh:mm:ss.SS"];
    _startTimeLabel.text = [formatter stringFromDate:[NSDate date]];
    UIButton *startButton = (UIButton *)sender;
    // Creates the start time stamp for use in the calculation
    startTime = [NSDate timeIntervalSinceReferenceDate];
    // sets button states
    startButton.enabled = NO;
    stop.enabled = YES;
    // Hides keypad on startButton click
    [self.startLevel resignFirstResponder];
    [self.stopLevel resignFirstResponder];

    // saves the value for restoration using user defaults
    NSDateFormatter *startTimeSave = formatter;
    [[NSUserDefaults standardUserDefaults]
     setObject:startTimeSave forKey:@"startTimeSaver"];
    }

person C_Dub    schedule 13.02.2014    source источник


Ответы (1)


Вы можете сохранить свои текстовые значения, используя пользовательские значения по умолчанию. Вот пример фрагмента кода:

NSString *valueToBeSaved = @"someValue";
[[NSUserDefaults standardUserDefaults]
setObject:valueToBeSaved forKey:@"preferenceName"];

И для получения вашего значения позже используйте это:

NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"preferenceName"];
person Sudershan shastri    schedule 13.02.2014
comment
Вы можете либо поместить его в свой контроллер, либо создать для этого отдельный класс. Вы можете перейти по следующим ссылкам: iphonedevsdk.com/forum/iphone-sdk-development/ , icodeblog.com/2008/10/03/ - person Sudershan shastri; 13.02.2014
comment
Пришлось отойти на минуту. Собираюсь попробовать прямо сейчас. Будет ли какой-то вариант этого работать для моих меток и сегментированных элементов управления? - person C_Dub; 13.02.2014
comment
Это будет работать для таких значений, как текст, который вы хотите сохранить. Может не работать для целевых объектов C. - person Sudershan shastri; 13.02.2014
comment
Это будет работать для таких значений, как текст и логические значения, которые вы хотите сохранить. Может не работать для всех объективных объектов C, но может работать для некоторых свойств. - person Sudershan shastri; 13.02.2014
comment
Это не работает так, как я настроил. Я пытаюсь сохранить отметку времени, полученную с помощью нажатия кнопки. Я обновляю свой OP, чтобы показать код. - person C_Dub; 13.02.2014
comment
Что он показывает? Вы получаете сохраненное значение? - person Sudershan shastri; 13.02.2014
comment
Я смог заставить это работать, настроив свой исходный код кодирования/декодирования, и под работой я имею в виду, что данные остаются для текстовых полей, сегментированных элементов управления и меток времени в фоновом режиме/завершении. Что странно, когда я запускаю расчет, когда возвращаюсь, я получаю в результате INF. Лог показывает правильные значения в уравнении, но возвращает бесконечность. Кроме того, возврат в главное меню стирает все пользовательские данные. Надо еще в этом разобраться. - person C_Dub; 13.02.2014