我已經添加下面的圖片來幫助說明問題更好:請教動態改變默認核心數據模型內容
嗨,
我在尋找的最佳切入點直接更改存儲在我的核心數據模型中的數據 - 說作爲該區域的新成員。從我的閱讀中我很自信,我不應該碰我的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字符串逐一保存,因爲這直接改變了模型並避免了控制器,我認爲這是建議的路線。
更新:
我有一個子類建立了NSTableView
和NSArrayController
。我能夠使用它們來檢測對錶格中行的選擇更改並將其打印到控制檯。該子類被稱爲:
@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"];
並哭了一個(也許是臨時)鬆了一口氣。