undo prepareWithInvocationTarget KVC

  • Hello,

    In my project, the following line of code works :

    [[[self undoManager] prepareWithInvocationTarget:[myArray
    objectAtIndex:0]] setTarget:@"Hello"];

        myArray is an NSArray containing instances of class myObj.
        Class myObj has two methods :

        - (void)setTarget:(NSString *)aString;
        - (NSString *)target;

        myArray is bound to a tableview column.

    When I replace the line with :

    [[[self undoManager] prepareWithInvocationTarget:[myArray
    objectAtIndex:0]] setValue:@"Hello" forKey:@"target"];

    the following errors can occur :

    sigsev,
    sigbus,
    [<NSCFString 0x33d950> valueForUndefinedKey:]: this class is not key
    value coding-compliant for the key target.

    Does anyone know why it's looking for the key "target" in a string
    instead of a myObj instance ?

    The error occurs after the prepareWithInvocationTarget code has run,
    when a new row is selected in the tableview.

    Thanks for any insight.

      - Steve Spencer
  • I've found a solution :

            myObj *mx = [myArray objectAtIndex:0];

            SEL theSelector = @selector(setValue:forKeyPath:);
            NSMethodSignature *sig = [mx
    methodSignatureForSelector:theSelector];
            NSInvocation *inv = [NSInvocation
    invocationWithMethodSignature:sig];
            [inv setSelector:theSelector];
            [inv setTarget:mx];

            NSString *h = @"Hello";
            NSString *t = @"target";

            //Note: indices 0 and 1 are reserved for self and _cmd
            [inv setArgument:&h atIndex:2];
            [inv setArgument:&t atIndex:3];

            [[self undoManager] prepareWithInvocationTarget:mx];
            [[self undoManager] forwardInvocation:inv];

      - Steve Spencer

    On 3 Jul 2005, at 01:18, Steven Spencer wrote:

    > Hello,
    >
    > In my project, the following line of code works :
    >
    > [[[self undoManager] prepareWithInvocationTarget:[myArray
    > objectAtIndex:0]] setTarget:@"Hello"];
    >
    > myArray is an NSArray containing instances of class myObj.
    > Class myObj has two methods :
    >
    > - (void)setTarget:(NSString *)aString;
    > - (NSString *)target;
    >
    > myArray is bound to a tableview column.
    >
    >
    > When I replace the line with :
    >
    > [[[self undoManager] prepareWithInvocationTarget:[myArray
    > objectAtIndex:0]] setValue:@"Hello" forKey:@"target"];
    >
    > the following errors can occur :
    >
    > sigsev,
    > sigbus,
    > [<NSCFString 0x33d950> valueForUndefinedKey:]: this class is not
    > key value coding-compliant for the key target.
    >
    > Does anyone know why it's looking for the key "target" in a string
    > instead of a myObj instance ?
    >
    >
    > The error occurs after the prepareWithInvocationTarget code has
    > run, when a new row is selected in the tableview.
    >
    > Thanks for any insight.
    >
    > - Steve Spencer
    >
previous month july 2005 next month
MTWTFSS
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Go to today