NSTableView с ячейкой флажка - PullRequest
       2

NSTableView с ячейкой флажка

6 голосов
/ 15 сентября 2011

После добавления NSTableView в xib на Xcode 4 я установил 4 столбца.1-й столбец - это простой столбец, который будет содержать название элемента.Остальные 3 являются флажками.Я перетащил Check Box Cell из библиотеки объектов в табличное представление.

Я заполняю таблицу, и флажки создаются и отображаются, однако, если я нажимаю на ничего, ничего не происходит, я не могу проверить или снять их.Более того, я даже не знаю, как это сделать с помощью кода.

Как я могу заставить эту работу работать: иметь возможность ставить или снимать флажки и получать их состояния из кода.

Iуже видел этот вопрос , и он на самом деле не ответил на мой вопрос.

Ниже приведен код для работы с таблицей в соответствии с запросом:

- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
    return (int)[myArray count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    if([[tableColumn identifier] isEqualToString:@"col1"])
    {
       return[NSNumber numberWithInt:NSOffState];
    }    

    return [myArray objectAtIndex:row];
}

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSLog(@"%d", [anObject boolValue]);
    if([[tableColumn identifier] isEqualToString:@"col1"])
    {
        NSLog(@"click col1");
    }        
    if([[tableColumn identifier] isEqualToString:@"col2"])
    {
        NSLog(@"click col2");
    }        

}

Я просто добавил больше кода.Как мне установить, чтобы отметить / снять флажок?

1 Ответ

8 голосов
/ 15 сентября 2011

Модель

Вам необходимо выбрать модель, т. Е. Как вы будете представлять данные, отображаемые в табличном представлении.Например:

// SomeObject.h
#import <Foundation/Foundation.h>
@interface SomeObject
@property (copy) NSString *name;
@property (assign,getter=isVisible) BOOL visible;
@property (assign,getter=isOpaque) BOOL opaque;
@property (assign,getter=isAnimatable) BOOL animatable;
@end

// SomeObject.m
#import "SomeObject.h"
@implementation SomeObject
@synthesize name, visible, opaque, animatable;
- (void)dealloc {
    [name release];
    [super dealloc];
}
@end

Файл пера

Ради этого ответа дайте идентификаторы столбцов таблицы, которые соответствуют именам свойств в SomeObject.

.значения из модели в табличное представление

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    // Retrieve the model object corresponding to `row'
    SomeObject *obj = [myArray objectAtIndex:row];

    // Return the object property corresponding to the column
    if([[tableColumn identifier] isEqualToString:@"name"])
    {
        return obj.name;
    }
    // Since this method has return type `id', we need to box the
    // boolean values inside an `NSNumber' instance
    else if([[tableColumn identifier] isEqualToString:@"visible"])
    {
        return [NSNumber numberWithBool:obj.visible];
    }
    else if([[tableColumn identifier] isEqualToString:@"opaque"])
    {
        return [NSNumber numberWithBool:obj.opaque];
    }
    else if([[tableColumn identifier] isEqualToString:@"animatable"])
    {
        return [NSNumber numberWithBool:obj.animatable];
    }

    return nil;
}

Использование значений из табличного представления для обновления модели

- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    // Retrieve the model object corresponding to `row'
    SomeObject *obj = [myArray objectAtIndex:row];

    // Set the object property corresponding to the column
    if([[tableColumn identifier] isEqualToString:@"name"])
    {
        obj.name = anObject;
    }
    // Since the new value (`anObject') is an object, we need to
    // convert it to `BOOL' by sending it `-boolValue'
    else if([[tableColumn identifier] isEqualToString:@"visible"])
    {
        obj.visible = [anObject boolValue];
    }        
    else if([[tableColumn identifier] isEqualToString:@"opaque"])
    {
        obj.opaque = [anObject boolValue];
    }        
    else if([[tableColumn identifier] isEqualToString:@"animatable"])
    {
        obj.animatable = [anObject boolValue];
    }
}

Этот код можно упростить с помощью кодирования значения ключано это оставлено в качестве упражнения после того, как вы освоите источники данных представления таблицы.: P

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