Неопознанный селектор отправлен на ошибку экземпляра - PullRequest
0 голосов
/ 21 августа 2009

Я создаю свое приложение после добавления некоторого кода, но я получаю сообщение «Неизвестный селектор отправлен в экземпляр ошибки», что останавливает работу моего приложения. Вот изображение ошибки -

альтернативный текст http://www.grabup.com/uploads/20f66eecee4bd96198c7bbcfe647ec74.png?direct

Это код, который я добавил (он предназначен для источника данных NSOutlineView)

- (id)init 
{
    self = [super init];
    if (self != nil) {
        // initialization code, rootsObjects is a NSArray instance variable
        rootObjects = [NSArray arrayWithObjects:@"Joshua", @"Erne", nil];
    }
    return self;
}

// here NSOutlineView asks how many children rows to display for a given item
- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
    // if item is nil this should be a Root row, else I pass 0 for example but should be the count of objects contained in item
    return (item == nil) ? [rootObjects count] : 0;
}

// here NSOutlineView asks if a given item can be expanded i.e contains children
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
    // again I return YES for example, but should be based on the count of objects contained in item
    return YES; //(item == nil) ? YES : ([item numberOfChildren] != -1);
}

// here NSOutlineView asks for the object (some treelike structure) assigned to the nth index child row of item 
- (id)outlineView:(NSOutlineView *)outlineView
            child:(int)index
           ofItem:(id)item
{
    // if item is nil I opass the appropriate Root row, else I pass nil for example but should be an object contained in item
    return (item == nil) ? [rootObjects objectAtIndex:index] : nil;
}

// here NSOutlineView asks for the objectValue (usually a NSString)) to be displayed in tableColumn for the given item
- (id)outlineView:(NSOutlineView *)outlineView
objectValueForTableColumn:(NSTableColumn *)tableColumn
           byItem:(id)item
{
    // pass the object we want to display in the tableColumn for item
    return item ;
    // here I pass item for example since I know it's a NSString, but usually will be something to compute.
    // the [tableColumn identifier] property (that can be set in Interface Builder) is very useful here.
}

// here NSOutlineView asks for the NSCell to be used by tableColumn for the given item
- (NSCell *)outlineView:(NSOutlineView *)ov 
 dataCellForTableColumn:(NSTableColumn *)tableColumn 
                   item:(id)item 
{
    // the nil tableColumn represents the unified root row style
    if (tableColumn == nil) {
        // pass a cell we want to be used as root row (assume we've have assigned "Name" as identifier of some tableColumn)
        return [[treeTable tableColumnWithIdentifier:@"Name"] dataCell];
    }
    // else just pass the default cell
    return [tableColumn dataCellForRow:[treeTable rowForItem:item]];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {
    return YES;
}

Вот код, который у меня есть в том же файле (источник данных), что и код выше.

- (void)awakeFromNib {  

    dragType = [NSArray arrayWithObjects:   @"factorialDragType", nil];

    [ dragType retain ]; 

    [ treeTable registerForDraggedTypes:dragType ];
    NSSortDescriptor* sortDesc = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES];
    [groupTreeControl setSortDescriptors:[NSArray arrayWithObject: sortDesc]];
    [ sortDesc release ];
}   


//------------------------------------
#pragma mark NSOutlineView datasource methods -- see NSOutlineViewDataSource
//---------------------------------------------------------------------------   
- (BOOL) outlineView : (NSOutlineView *) outlineView 
          writeItems : (NSArray*) items 
        toPasteboard : (NSPasteboard*) pboard {

    [ pboard declareTypes:dragType owner:self ];        
    // items is an array of _NSArrayControllerTreeNode see http://theocacao.com/document.page/130 for more info
    draggedNode = [ items objectAtIndex:0 ];

    return YES; 
}




- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(int)index {

    _NSArrayControllerTreeNode* parentNode = item;
    _NSArrayControllerTreeNode* siblingNode;
    _NSControllerTreeProxy* proxy = [ groupTreeControl arrangedObjects ];

    NSManagedObject* draggedGroup = [ draggedNode observedObject ];

    BOOL draggingDown = NO;
    BOOL isRootLevelDrag = NO;

    // ----------------------
    // Setup comparison paths
    // -------------------------
    NSIndexPath* draggedPath = [ draggedNode indexPath ];
    NSIndexPath* siblingPath =  [ NSIndexPath indexPathWithIndex:  index  ];
    if ( parentNode == NULL ) {     
        isRootLevelDrag = YES;
    } else {
        // A non-root drag - the index value is relative to this parent's children
        siblingPath = [ [ parentNode indexPath ] indexPathByAddingIndex: index ];
    }

    // ----------------------
    // Compare paths - modify sibling path for down drags, exit for redundant drags
    // -----------------------------------------------------------------------------    
    switch ( [ draggedPath compare:siblingPath] ) {
        case NSOrderedAscending:  // reset path for down dragging
            if ( isRootLevelDrag ) {
                siblingPath = [ NSIndexPath indexPathWithIndex: index  - 1];                             
            } else {
                siblingPath = [ [ parentNode indexPath ] indexPathByAddingIndex: index - 1 ]; 
            }
            draggingDown = YES;
            break;

        case NSOrderedSame:
            return NO;
            break;               
    }

    siblingNode = [ proxy nodeAtIndexPath:siblingPath ];    

    //  NSLog(@"returning early");
    //  return NO;  // TODO robustify


    // ------------------------------------------------------------ 
    // SPECIAL CASE: Dragging to the bottom
    // ------------------------------------------------------------
    // - K                               - K                            - C                              - C
    // - - U                             - - C     OR     - U                                - F
    // - - C     ====>     - - F                    - F                              - K
    // - - F               - U              - K                              - U
    // ------------------------------------------------------------ 
    if ( isRootLevelDrag  && siblingNode == NULL ) {        
        draggingDown = YES;
        siblingPath = [ NSIndexPath indexPathWithIndex: [ proxy count ] - 1 ];          
        siblingNode = [ proxy nodeAtIndexPath:siblingPath ] ;
    }

    // ------------------------------------------------------------ 
    // Give the dragged item a position relative to it's new sibling
    // ------------------------------------------------------------ 
    NSManagedObject* sibling = [ siblingNode observedObject ];   
    NSNumber* bystanderPosition = [ sibling valueForKey:@"position"];
    int newPos =   ( draggingDown ? [ bystanderPosition intValue ]  + 1 : [ bystanderPosition intValue ]  - 1 );
    [draggedGroup setValue:[ NSNumber numberWithInt:newPos ] forKey:@"position"];   

    // ----------------------------------------------------------------------------------------------
    // Set the new parent for the dragged item, resort the position attributes and refresh the tree
    // ----------------------------------------------------------------------------------------------    
    [ draggedGroup setValue:[ parentNode observedObject ] forKey:@"parent" ];
    [ self resortGroups:[draggedGroup managedObjectContext] forParent:[ parentNode observedObject ] ];          
    [ groupTreeControl rearrangeObjects ];  
    return YES;             
}






- (NSArray* ) getSubGroups:(NSManagedObjectContext*)objectContext forParent:(NSManagedObject*)parent {
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"projects" inManagedObjectContext:objectContext];

    [request setEntity:entity];
    NSSortDescriptor* aSortDesc = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject: aSortDesc] ];
    [aSortDesc release];

    NSPredicate* validationPredicate = [NSPredicate predicateWithFormat:@"parent == %@", parent ];

    [ request setPredicate:validationPredicate ];

    NSError *error = nil;  // TODO - check the error bozo
    return [objectContext executeFetchRequest:request error:&error];    
}




- (void) resortGroups:(NSManagedObjectContext*)objectContext forParent:(NSManagedObject*)parent {

    NSArray *array = [ self getSubGroups:objectContext forParent:parent ];

    // Reset the indexes...
    NSEnumerator *enumerator = [array objectEnumerator];
    NSManagedObject* anObject;
    int index = 0;
    while (anObject = [enumerator nextObject]) {
        // Multiply index by 10 to make dragging code easier to implement ;) ....
        [anObject setValue:[ NSNumber numberWithInt:(index * INTERVAL ) ] forKey:@"position"];    
        index++;
    }   


}

- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(int)index {

    _NSArrayControllerTreeNode* newParent = item;

    // drags to the root are always acceptable
    if ( newParent == NULL ) {  
        return  NSDragOperationGeneric; 
    }

    // Verify that we are not dragging a parent to one of it's ancestors
    // causes a parent loop where a group of nodes point to each other and disappear
    // from the control 
    NSManagedObject* dragged = [ draggedNode observedObject ];      
    NSManagedObject* newP = [ newParent observedObject ];

    if ( [ self category:dragged isSubCategoryOf:newP ] ) {
        return NO;
    }       

    return NSDragOperationGeneric;
}

- (BOOL) category:(NSManagedObject* )cat isSubCategoryOf:(NSManagedObject* ) possibleSub {

    // Depends on your interpretation of subCategory ....
    if ( cat == possibleSub ) { return YES; }

    NSManagedObject* possSubParent = [possibleSub valueForKey:@"parent"];   

    if ( possSubParent == NULL ) {  return NO; }

    while ( possSubParent != NULL ) {       
        if ( possSubParent == cat ) { return YES;   }

        // move up the tree
        possSubParent = [possSubParent valueForKey:@"parent"];          
    }   

    return NO;
}

// This method gets called by the framework but the values from bindings are used instead

Ответы [ 2 ]

1 голос
/ 21 августа 2009

Ошибка должна содержать имя класса, который получил нераспознанный метод и нераспознанный метод, который был отправлен.

(1) Если вы узнаете имя метода - если вы написали строку (или строки) кода, который вызывает этот метод - просмотрите строку (и) кода и убедитесь, что цель вызова метода допустимый, имеет правильный тип и не был переиздан где-то еще.

Часто ошибка нераспознанного вызова метода возникает, когда вы где-то перепустили объект, и новый объект неправильного типа поселился в памяти старого объекта.

(2) Если вы не написали вызов этого метода, значит, вы предоставили другой объект неправильного типа для какого-либо метода фреймворка или, опять же, вы что-то перевыпустили.

Если вы подозреваете перевыпуск, включите NSZombies или используйте функцию отслеживания Zombie в Инструментах (да, как сказал Питер).

Итак, ошибка NSTreeControllerTreeNode ... doesn't respond to -copyWithZone:.

Почти гарантия, указывающая, что вы пытались вставить узел дерева контроллера дерева в словарь где-то в качестве ключа, и словарь пытается его скопировать. По крайней мере, так обычно и происходит.

Это все еще может быть проблемой избыточного выпуска, когда экземпляр NSTreeControllerTreeNode находится в памяти, где раньше находилась строка NSString.

Найдите в документации Xcode NSZombie для получения дополнительной информации о включении его в текущей версии инструментов dev.

0 голосов
/ 22 августа 2009

NSTreeControllerTreeNode не является стандартным классом какао.

Вы хотели использовать вместо NSTreeController или NSTreeNode?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...