我正在为自己编写一个小型项目时间管理程序,但遇到了一个让我感到困惑的问题。
他们的设置方式是我有一个名为的对象TCObject
,我在另一个名为ProjectTimerController
. ProjectTimerController
是一个NSWindowController
并且它有它自己的NIB文件。
我正在做的事情非常简单。当您单击 a 中的一行时,会NSTableView
ProjectTimerController
找到TCObject
与该行相对应的 a。然后它将信息从那里加载TCObject
到一个界面中,您可以在其中查看和编辑一些内容。
这是它的截图:
现在,当我更改文本NSTextView
然后按添加按钮时,-saveString
调用函数并且currentSelection
(它是 aTCObject
并且代表当前选定的行)并且它的 notes 变量已设置。我知道 _notes 设置为新值,因为 NSLog 函数在setString
运行时记录了 _notes 中的正确字符串。-tableViewSelectionDidChange:
在将currentSelection 设置为新选择的对象之前 ,登录了相同的、正确的字符串。
但是,如果我选择刚刚更改注释的行,它只会加载相同的文本,“初始字符串”并检查_notes
告诉我它是“初始字符串”。
我没有这个问题的东西isFinished
。当切换完成复选框时,我将相应TCObjects
的isFinished
布尔值设置为与复选框相同的值。该对象会记住并根据我选择的行正确更改。
[编辑]
*我在这里添加了更清晰的解释。
我单击 NSTableView 中的一行(让我们说最上面的一行)
这会从 myProjects 数组加载一个相应的 TCObject,并将该对象的变量添加到 Notes NSTextView 框中,并打开或关闭 Finished。
如果我现在写入“注释”框并按“添加”,则该文本将设置到该 TCObject 的 _notes 变量中。
因此,如果我单击另一行,则会将其他一些文本加载到“注释”框中。点击第一行应该会给我刚刚在步骤 3 中写入 Notes 的字符串。但它没有。_notes 似乎总是包含我在 -init 方法中初始化它时设置的字符串。
“完成”复选框工作正常。当我单击状态时,单击一行时已正确保存和加载。
我知道当我按下 Add 按钮时 _notes 设置正确,因为 setString 中的 NSLog 方法记录了我在按下 Add 按钮时写入 Notes 的字符串。
[/编辑]
下面是TCObject
和的准系统版本ProjectTimerController
。
//TCObject.h
@interface TCObject : NSObject
{
NSString *_notes;
Boolean _isFinished;
}
@property (retain, nonatomic) NSString *notes;
@property (nonatomic) Boolean isFinished;
@end
//TCObject.m
#import "TCObject.h"
@implementation TCObject
@synthesize notes = _notes, isFinished = _isFinished;
-(id)init{
if (self = [super init]) {
self.notes = @"Initial string";
self.isFinished = NO;
}
return self;
}
- (void)dealloc {
[_notes release]; _notes = nil;
[super dealloc];
}
-(void)setNotes:(NSString *)notes {
[notes retain];
[_notes release];
_notes = notes;
NSLog(@"Setting _notes as: %@", _notes);
}
-(NSString *)notes {
NSLog(@"Getting _notes, which is: %@", _notes);
return _notes;
}
@end
//ProjectTimerController.m
- (id)initWithWindow:(NSWindow *)window {
self = [super initWithWindow:window];
if (self)
{
myProjects = [[NSMutableArray alloc]init];
currentSelection = nil;
TCObject *newProject = [[TCObject alloc] init];
TCObject *newProject2 = [[TCObject alloc] init];
TCObject *newProject3 = [[TCObject alloc] init];
TCObject *newProject4 = [[TCObject alloc] init];
[myProjects addObject:newProject];
[myProjects addObject:newProject2];
[myProjects addObject:newProject3];
[myProjects addObject:newProject4];
}
return self;
}
-(IBAction)isFinishedToggle:(id)sender {
if(currentSelection != nil){
currentSelection.isFinished = finishedCheckBtn.state;
}
}
-(IBAction)saveString:(id)sender {
if(currentSelection != nil){
currentSelection.notes = [[notesField textStorage] string];
}
}
//delegate function for NSTableView
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
NSInteger selectedIndex = [table selectedRow];
if(selectedIndex == -1){
return;
}
//here the correct notes string is printed
NSLog(@"curr: %i", currentSelection.notes);
currentSelection = [myProjects objectAtIndex:selectedIndex];
NSString *notesInfo = currentSelection.notes;
Boolean isFinishedInfo = currentSelection.isFinished;
[notesField setString:notesInfo];
[finishedCheckBtn setState:isFinishedInfo];
}