关于动态更改默认核心数据模型内容的建议

时间:2011-02-16 11:43:23

标签: objective-c xcode core-data nsmanagedobject

我添加了以下图片以帮助更好地说明问题:

image of window

您好,

我正在寻找直接改变存储我的核心数据模型的数据的最佳起点 - 作为该地区新手的人说话。从我的阅读中我非常自信我不应该触摸我的NSArrayController,这是我天生的本能,而且我应该始终处理模型。这是有道理的,但因为我已经使用了绑定和核心数据,xcode已经为我生成了所有内容,而且我没有从头开始构建一个类的感觉。

对于我的初始任务,我有一个“工作”实体和NSArrayController。它有一个jobTotalHours属性,该属性是00:00:00格式的字符串,并且NSTableView中的每个作业都有相应的“小时”列。与此分开,我有一个秒表按钮,它链接到旁边的文本字段,显示时间为00:00:00字符串。我有一个班级工作,启动和停止计时器计数,并以小时,分钟和秒的增量显示它。

我需要做的是让计时器为NSTableView中突出显示的当前作业的jobTotalHours属性添加时间。现在,单独的文本字段已绑定显示当前突出显示的小时列的时间,以便部分处理。换句话说,计时器最初是将时间添加到测试变量并将其显示在自主文本字段中以用于测试原因。现在我需要它来为表格视图中突出显示的任何作业添加时间,我需要以编程方式访问模型,而不确定首先采取的步骤。

提前感谢任何建议。如果它有用,我会在下面包含计时器类。我很确定它的粗糙和糟糕但它有效:

timerController.h:

#import <Cocoa/Cocoa.h>
BOOL timerStarted;
int timerCount;
int timerSeconds;
int timerMinutes;
int timerHours;
NSString *timerString;
NSString *timerFieldSeconds;
NSString *timerFieldMinutes;
NSString *timerFieldHours;

@interface timerController : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    NSTimer *timerNoOne;
    IBOutlet NSCell *timerOneOutputLabel;
    IBOutlet id timerClockField;
}
-(IBAction)toggleTimerClock:(id)sender;
@property (assign) IBOutlet NSWindow *window;

@end

timerController.m:

#import "timerController.h"


@implementation timerController
-(IBAction)toggleTimerClock:(id)sender
{
    if (timerStarted==FALSE) {
        timerStarted = TRUE;
    } else {
        timerStarted = FALSE;
    }
}

@synthesize window;


- (void) awakeFromNib {
    // clear timer 
    [timerClockField setStringValue:@"00:00:00"];
    // initialize timer to count each second
    timerNoOne = [NSTimer scheduledTimerWithTimeInterval:1 
                            target:self 
                            selector:@selector(updateTimerNoOne:) 
                            userInfo:nil 
                            repeats:YES];   

}


- (void) updateTimerNoOne:(NSTimer *) timer {
    if (timerStarted==FALSE) {
        // do nothing. Timer is switched off.
    } else {
        timerCount = timerCount + 1;
        timerSeconds = fmod(timerCount, 60);
        timerMinutes = floor(timerCount / 60);
        timerHours = floor(timerCount / 3600);

        if (timerSeconds < 10) { // add a leading 0 for formatting reasons.
            timerFieldSeconds = [NSString stringWithFormat:@"0%d",timerSeconds];
        } else {
            timerFieldSeconds = [NSString stringWithFormat:@"%d",timerSeconds];
        }

        if (timerMinutes < 10) {
            timerFieldMinutes = [NSString stringWithFormat:@"0%d",timerMinutes];
        } else {
            timerFieldMinutes = [NSString stringWithFormat:@"%d",timerMinutes];
        }

        if (timerHours < 10) {
            timerFieldHours = [NSString stringWithFormat:@"0%d",timerHours];
        } else {
            timerFieldHours = [NSString stringWithFormat:@"%d",timerHours];
        }

        NSString *timerString = [NSString stringWithFormat:@"%@:%@:%@",timerFieldHours,timerFieldMinutes,timerFieldSeconds];
        //[timerClockField setStringValue:timerString];

    }
}
@end

更新

从阅读更多内容,我想知道这是一种更好的方法让我在计时器更改的每一秒更新文本单元格中的字符串,然后只在计时器结束时提交对模型的更改(例如,时钟是停止)。以前我在考虑将模型的jobTotalHours字符串逐秒保存,因为这会直接改变模型并避开控制器,我认为这是建议的路径。

更新

我为NSTableViewNSArrayController设置了一个子类。我能够使用它们来检测表中行的选择更改并将它们打印到控制台。子类被称为:

@interface modelUtilController : NSObject

其中执行上述任务很好。我现在想要NSManagedObject的出口,以便我可以直接操纵其中的资产,同时保持NSTableView的出口以检测行选择中的变化。我读到子类应该是

@interface modelUtilController : NSManagedObject

我将其更改为并包含数据模型的插座。这会导致原始检测因行选择的变化而崩溃,所以我现在做错了。也许我必须将子类分成2个?

更新:可能完成

好的,我想我已经在3天后解决了这个问题。据我所知,它的工作正在进行中,但我还没有充分发挥它的作用。基本上我创建了一个单独的函数,我每秒钟从我的计时器调用一次:

void amendTotalHours(id anObject)

此功能使用我的作业NSArrayController,然后使用以下命令查找小时列中的当前值:

NSArray *selectedObjectsArray = [anObject selectedObjects];
NSManagedObjectModel *firstSelectedObject = [selectedObjectsArray objectAtIndex:0];
NSString *readCurrentTime = [firstSelectedObject valueForKey:@"jobTotalHours"];

然后我将格式化为00:00:00的时间字符串转换为总秒数的整数。我为来自计时器的每个调用添加一个,然后将秒转换回00:00:00格式的字符串。最后,我使用以下命令将其发送回NSArrayController:

[firstSelectedObject setValue:[NSString stringWithFormat:@"%@", timeValue] forKey:@"jobTotalHours"];

哭了(也许是暂时的)松了一口气。

1 个答案:

答案 0 :(得分:0)

好的,我想我已经在3天后解决了这个问题。据我所知,它的工作正在进行中,但我还没有充分发挥它的作用。基本上我创建了一个单独的函数,我每秒钟从我的计时器调用一次:

void amendTotalHours(id anObject)

此功能使用我的作业NSArrayController,然后使用以下命令查找小时列中的当前值:

NSArray *selectedObjectsArray = [anObject selectedObjects];
NSManagedObjectModel *firstSelectedObject = [selectedObjectsArray objectAtIndex:0];
NSString *readCurrentTime = [firstSelectedObject valueForKey:@"jobTotalHours"];

然后我将格式化为00:00:00的时间字符串转换为总秒数的整数。我为来自计时器的每个调用添加一个,然后将秒转换回00:00:00格式的字符串。最后,我使用以下命令将其发送回NSArrayController:

[firstSelectedObject setValue:[NSString stringWithFormat:@"%@", timeValue] forKey:@"jobTotalHours"];

哭了(也许是暂时的)松了一口气。