0

AddCityViewController восстановлен с соответствующими текстовыми полями. Кнопки «Отмена» и «Сохранить» содержат вызовы делегата. Контроллер модального просмотра восстанавливается, но кнопки «Сохранить» и «Отмена» не активируют метод делегата. Все диспетчеры представлений созданы внутри раскадровки.слабый ссылочный делегат не восстановлен

// AddCityViewController.h 

@class City; 

#import <UIKit/UIKit.h> 
@protocol addCityDelegate; 

@interface AddCityViewController : UIViewController 
@property(nonatomic, weak) id <addCityDelegate> delegate; 
@property(nonatomic,strong)NSManagedObjectContext *context; 
@end 

@protocol addCityDelegate 
- (void)save: (City *)controller withBool:(BOOL)saveStatus;; 
@end 

Кнопка «Отмена» вызывает только метод делегата, когда State Restoration не выполняется.

Я хочу делегат также вызывается, когда его необходимо для восстановления состояния

// AddCityViewController.m 

- (IBAction)cancelButton:(UIBarButtonItem *)sender { 
    [self.delegate save:nil withBool:false]; 
} 

#pragma mark - encodeRestorable and decodeRestorable 

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 
    [coder encodeObject:self.delegate forKey:@"restoreDelegate"]; 
    [coder encodeObject:self.cityNameLabel.text   
       forKey:@"restoreCountyLabelText"];  
} 

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [coder encodeObject:self.delegate forKey:@"restoreDelegate"]; 
    _cityNameLabel.text = [coder decodeObjectForKey:@"restoreCountyLabelText"]; 

    [super decodeRestorableStateWithCoder:coder]; 
} 

CityTableViewController является делегатом для AddCityTableView

// CityTableViewController.m 

    #import "CityTableViewController.h" 
    #import "AddCityViewController.h" 

    #import "City.h" 
    #import "County.h" 

    @interface CityTableViewController()<addCityDelegate> 
    @property(nonatomic,strong)NSFetchedResultsController *fetchedResultsController; 
    @end 
    #pragma mark - AddConjugations Delete 

...

Ниже Делегат метод отлично работает, за исключением STATE RESTORATION. Во время восстановления состояния этот метод никогда не называется.

- (void)save: (AddCityViewController *)saveNewCity withBool:(BOOL)saveStatus 
{ 
    if (saveStatus) { 
    ... 
} 
+1

Это довольно странно, чтобы архивировать делегат как часть архивного графа объектов. Как правило, это то, что вы воссоздаете, когда пользовательский интерфейс станет доступным. В общем. – bbum

+0

Я не знаю, как воссоздать делегата, когда контроллер просмотра будет восстановлен. При восстановлении состояния контроллер представления возвращается с текстом текстового поля, но self.delegate = (null). –

ответ

0

Вы пытаетесь снова закодировать своего делегата вместо его декодирования.

Изменить код:

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    self.delegate = [coder decodeObjectForKey:@"restoreDelegate"]; 
    _cityNameLabel.text = [coder decodeObjectForKey:@"restoreCountyLabelText"]; 

    [super decodeRestorableStateWithCoder:coder]; 
} 
+0

Благодарим вас за правильный ответ! –