2012-03-27 2 views
0

내 앱에서 사용자는 개체간에 빠르게 전환하고 해당 개체의 텍스트를 편집 할 수 있습니다.NSUndoManager가 작동중인 개체 찾기

"실행 취소"를 누르는 동안 관련 객체를 가져 와서 수행중인 실행 취소를 볼 수 있습니다.

개체는 NSManagedObject 하위 클래스의 인스턴스이며 을 만들 때 얻을 수있는 managedObjectContext과 함께 제공되는 실행 취소 관리자를 사용하고 있습니다.

다시 실행 취소 & 다시 실행이 정상적으로 작동합니다.

주어진 실행 취소 작업에 대해 어떤 개체가 '실행 취소'되고 있는지 어떻게 알 수 있습니까?

답변

1

그래서 이것을 알아 냈습니다. 내가 필요로하는 방법이었다 :

  • (무효) awakeFromSnapshotEvents : (NSSnapshotEventType) 플래그 NSManagedObject의 서브 클래스에서 재정의 될 수

.

이 메서드는 객체가 실행 취소 또는 다시 실행의 영향을받을 때마다 호출됩니다. 이전에 실행 취소가 객체를 삽입하거나 삭제할 때 호출 된 느낌 이었지만 객체가 변경된 경우 호출됩니다.

이 메소드에서 수행하는 작업은 objectID가 포함 된 알림을 게시 한 다음 해당 알림을 받으면 내가받은 objectID에 해당하는 개체를 찾습니다. 내 NSManagedObject 하위 클래스에 따라서

, 내 awakeFromSnapshotEvents은 다음과 같습니다

- (void)awakeFromSnapshotEvents:(NSSnapshotEventType)flags { 
    NSManagedObjectID *thisID = self.objectID; 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:thisID forKey:@"noticeObjectID"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"awakeFromSnapshotNotification" object:self userInfo:userInfo]; 
} 

그리고 수신기의 viewWillAppear에서

, 나는 알림 등록 :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didAwakeManagedObject:) name:@"awakeFromSnapshotNotification" object:nil]; 

마지막으로, 내 수신기의 didAwakeManagedObject: 방법은 같다 이. 아마이 방법을 사용하는 것이 더 좋을지 모르지만,이 방법이 저에게는 잘 작동합니다. 코어 데이터를 기반으로하는 NSOrderedSet 내에서 필요한 객체의 인덱스 위치에 대해 걱정할 수 있으므로 올바른 순서를 찾을 때까지 정렬 된 세트를 반복합니다.

- (void) didAwakeManagedObject:(NSNotification*)notice { 
    for (int i=0; i<project.orderedSet.count; i++) { 
     if ([notice.userInfo objectForKey:@"noticeObjectID"] == [[project.orderedSet objectAtIndex:i] objectID]) { 
     NSLog(@"%d IS EQUAL", i); 
     return; 
     } 
    } 
} 
관련 문제