Невозможно заставить отменить и повторить действие в приложении основных данных какао

У меня проблема с реализацией отмены и повтора в моем приложении какао основных данных. Это второй вопрос, который я задаю по той же теме (вы можете прочитать мой первый вопрос здесь), и даже несмотря на то, что я получил дельный совет по моему первому вопросу, я все равно не могу заставить работать отмену и повтор.

В любом случае... вот мой текущий код:

Вот соответствующий код из файла MainWindowController.h:

#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"

@property (nonatomic,strong) NSManagedObjectContext *mObjContext;
@property AppDelegate *appDelegate;

Вот код из файла MainWindowController.m:

#import "MainWindowController.h"
@interface MainWindowController () <NSWindowDelegate>

@end

@implementation MainWindowController

- (void)windowDidLoad {
    self.appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
    self.mObjContext = self.appDelegate.managedObjectContext;
    [[self window]setDelegate:self];
    [self windowWillReturnUndoManager:self.window];
}

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
    return [[self document] undoManager];
}

@end

В моем окне есть следующие выходы в инспекторе соединений: делегат: владелец файла

Меню: ГлавноеМеню

Всякий раз, когда я вношу изменения в записи в своих nstableviews, изменения записываются, но пункты меню отмены и повтора остаются серыми. Я поместил точку останова в windowWillReturnUndoManager, но я не вижу, чтобы там был возвращен какой-либо undoManager... Кто-нибудь может сказать мне, что я делаю неправильно?


person user2417624    schedule 11.02.2016    source источник


Ответы (2)


Вы возвращаете undoManager документа (который, вероятно, равен нулю) вместо undoManager контекста управляемого объекта. Замените windowWillReturnUndoManager на

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
    return self.mObjContext.undoManager;
}
person Willeke    schedule 11.02.2016
comment
Ничего не происходит после того, как я изменю код... Отмена и повтор по-прежнему неактивны, даже если я вношу изменения, и эти изменения были сохранены. - person user2417624; 13.02.2016
comment
Как вы вносите изменения? - person Willeke; 13.02.2016
comment
Я меняю запись, например. После сохранения я должен иметь возможность отменить действие, но нет, пункты меню (отмена и повтор) оба выделены серым цветом. - person user2417624; 13.02.2016
comment
Используете ли вы NSArrayController и привязки или источник данных? - person Willeke; 15.02.2016
comment
NSArrayController и привязки. - person user2417624; 15.02.2016
comment
Вызывается ли windowWillReturnUndoManager, когда вы открываете меню «Правка» и начинаете редактирование? - person Willeke; 15.02.2016
comment
Да, это. Я добавил туда сообщение NSLog, и если я начну редактировать поле, появится сообщение NSLog. - person user2417624; 15.02.2016
comment
А при открытии меню Правка? Это стандартное меню редактирования по умолчанию? Все остальное работает? - person Willeke; 15.02.2016
comment
Меню «Правка» используется по умолчанию, другие команды (которые я создал в другом меню) работают. Сейчас я проверю, работают ли другие команды в меню редактирования. - person user2417624; 16.02.2016
comment
Что-то где-то не так, но я не могу сказать, что и где. - person Willeke; 16.02.2016

Ну наконец-то проблема решена. Я добавляю новый пункт меню редактирования, сохраняя при этом старый. Когда я вношу изменения в запись, новый пункт меню имеет доступный элемент отмены и работает. Повтор тоже сработал.

Итак, я удаляю старый пункт меню редактирования, и теперь все работает как часы. Жаль, что я не попробовал это раньше, но....

person user2417624    schedule 17.02.2016