【问题标题】:add columns to a table based on core data readout in specific order根据特定顺序读取的核心数据向表中添加列
【发布时间】:2013-01-29 13:18:44
【问题描述】:

情况:

有两个表,一个主表和一个辅助表。主表连接到核心数据数据库。 我已经按照我想要的方式设置了核心数据和主表。一切正常,我很高兴。

现在我必须将列添加到第二个表中。 基本上第二个表格视图有一个列(图像和文本表格单元格视图)。我需要为第一个表视图(与核心数据的数组控制器连接的那个)的每一行添加一列作为复选框列,并且该列的标题应该具有存储在排列对象.header 中的值。但这不是它。这些新列应按特定顺序排列:升序,基于第一个表中的 mappedobjects.order 值。

这应该在我点击界面上的更新按钮时执行。

所以问题是:

-如何根据第一个表视图的行数向第二个表视图添加列?

-如何根据存储在第一个 tableview 中的列中的值对列进行排序?

-如何以编程方式将列设置为复选框列?

-如何以编程方式将列标题设置为存储在数组控制器中的值?

期望结果的示例:

表 1(连接到核心数据)

 somecolumn | header | order | somecolumn | somecolumn
 ------------------------------------------------------
 text        hd1       3       text         text
 text        hd3       1       text         text
 text        hd4       7       text         text

表 2 的结构:(除第一列之外的所有复选框列,列顺序基于表 1 的“order”字段,列标题基于表 1 的“header”字段)

 existingcolumn | hd3 | hd1 | hd4

再次,请尽可能清楚。

谢谢

最好的问候

伊戈尔

我过去已经提出过类似的问题,但这个问题的内容要多得多,这就是我开始新问题的原因。我在网上搜索并没有找到这个特定问题的答案。还请记住,我是 Objective-c/cocoa 编程的新手,所以请在你的答案中明确。

【问题讨论】:

    标签: xcode cocoa core-data nstableview


    【解决方案1】:

    -如何根据第一个 tableview 的行数向第二个 table view 添加列?

    创建动态列。你可以在 rows.count 的循环内使用[tableView addTableColumn];

    -如何根据存储在第一个 tableview 中的列中的值对列进行排序?

    Order 的意思是...OrderBy?已排序,您永远不会对 tableview 进行排序,而是对模型数组进行排序。对数组进行排序并填充表格。

    -如何以编程方式将该列设置为复选框列?

    对于复选框的实现,请在此处找到project

    在你想要的列中画一个checkBoxCell复选框。或者您可以以编程方式进行。

    我是由 IB 做的。

    您需要创建一个数组来存储每个(行数)复选框的状态。

    - (id)init {
        self = [super init];
        if (self) {
    
            states=[[NSMutableArray alloc] initWithObjects:@"1", @"0", @"1", nil];
        }
        return self; }
    
    
    
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
        NSLog(@"Num of rows---- %ld", [names count]);
        return [names count];
    }
    

    检查 tableIdentifier 的值为“check”。

    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        if ([[tableColumn identifier] isEqualTo:@"name"]) {
            return [names objectAtIndex:row];
        }
        else if ([[tableColumn identifier] isEqualTo:@"check"]) {
    
            return [states objectAtIndex:row];
        }
        else if ([[tableColumn identifier] isEqualTo:@"states"]) {
            return [states objectAtIndex:row];
        }
        return 0;
    }
    

    根据开/关更新复选框的值。

    - (void)tableView:(NSTableView *)tableView setObjectValue:(id)value forTableColumn:(NSTableColumn *)column row:(NSInteger)row {          
        [states replaceObjectAtIndex:row withObject:value];
        [tableView reloadData]; 
    }
    

    -如何以编程方式将列标题设置为存储在数组控制器中的值?

    使用这一类,也可以使用一行语句:

    @interface NSTableColumn(SetTitle)
    
    - (void)setTitle:(NSString *)inTitle
    {
        [[self headerCell] setStringValue:inTitle] ;
        [[[self tableView] headerView] setNeedsDisplay:YES];
    }
    
    @end
    

    编辑:

    以编程方式复选框:

    - (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
    {
        NSButtonCell *cell=[[NSButtonCell alloc] init];
        NSString *strDisplayPlaylistName;
        strDisplayPlaylistName=[playListNameArray objectAtIndex:row];
        [cell setTitle:strDisplayPlaylistName];
        [cell setAllowsMixedState:YES];
        [cell setButtonType:NSSwitchButton];
        return cell; 
    }
    
    
    - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {          
        NSCell *aCell = [aTableColumn dataCellForRow:rowIndex];
        [aCell setNextState];
        //NSCell *aCell=[aAddedCells objectAtIndex:rowIndex];
        //[aCell setNextState];
    }
    

    【讨论】:

    • 谢谢,但您的回答仅涵盖管理部分问题的复选框。不是基于核心数据读数添加列,以编程方式添加复选框,根据读数对列进行排序?谢谢!
    • 已更新,但不确定正确性...太长了,我无法编译检查,至少您会有所了解
    • 你好!感谢您的回答!顺序是指我可以用数值指定顺序或列。 (参见第一篇文章中的示例)通过“以编程方式设置复选框列”我并不是要设置检查开/关。我的意思是,如果我以编程方式添加一个列(addTableColumn),那么我就有一个文本框列。我必须以编程方式将其更改为复选框列。抱歉,如果不清楚!谢谢!
    • 您想要以编程方式进行复选框?
    • 您写道:“在您想要拥有复选框的列中绘制一个 checkBoxCell。或者您可以通过编程方式完成。我是由 IB 完成的。”我需要的是以编程方式进行,而不是使用 IB。
    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多