0

我正在为自己编写一个小型项目时间管理程序,但遇到了一个让我感到困惑的问题。

他们的设置方式是我有一个名为的对象TCObject,我在另一个名为ProjectTimerController. ProjectTimerController是一个NSWindowController并且它有它自己的NIB文件。

我正在做的事情非常简单。当您单击 a 中的一行时,会NSTableView ProjectTimerController找到TCObject与该行相对应的 a。然后它将信息从那里加载TCObject到一个界面中,您可以在其中查看和编辑一些内容。
这是它的截图:

截屏

现在,当我更改文本NSTextView然后按添加按钮时,-saveString调用函数并且currentSelection(它是 aTCObject并且代表当前选定的行)并且它的 notes 变量已设置。我知道 _notes 设置为新值,因为 NSLog 函数在setString运行时记录了 _notes 中的正确字符串。-tableViewSelectionDidChange:在将currentSelection 设置为新选择的对象之前 ,登录了相同的、正确的字符串。

但是,如果我选择刚刚更改注释的行,它只会加载相同的文本,“初始字符串”并检查_notes告诉我它是“初始字符串”。

我没有这个问题的东西isFinished。当切换完成复选框时,我将相应TCObjectsisFinished布尔值设置为与复选框相同的值。该对象会记住并根据我选择的行正确更改。

[编辑]
*我在这里添加了更清晰的解释。

  1. 我单击 NSTableView 中的一行(让我们说最上面的一行)

  2. 这会从 myProjects 数组加载一个相应的 TCObject,并将该对象的变量添加到 Notes NSTextView 框中,并打开或关闭 Finished。

  3. 如果我现在写入“注释”框并按“添加”,则该文本将设置到该 TCObject 的 _notes 变量中。

  4. 因此,如果我单击另一行,则会将其他一些文本加载到“注释”框中。点击第一行应该会给我刚刚在步骤 3 中写入 Notes 的字符串。但它没有。_notes 似乎总是包含我在 -init 方法中初始化它时设置的字符串。

  5. “完成”复选框工作正常。当我单击状态时,单击一行时已正确保存和加载。

  6. 我知道当我按下 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];
}
4

1 回答 1

0

终于发现问题了。似乎以这种方式更改注释:

-(IBAction)saveString:(id)sender {
    if(currentSelection != nil){
        currentSelection.notes = [[notesField textStorage] string];
    }
}

导致一些问题。如果我这样做,一切正常:

-(IBAction)saveString:(id)sender{
    if(currentSelection != nil){
        NSString *temps = [NSString stringWithFormat:@"%@", [[notesField textStorage] string]];
        currentSelection.notes = temps;
    }
}

所以我猜测发生了什么是 _notes 指向我的 NSTextView 中包含的文本。因此,当我更改文本时,_notes 也发生了变化或类似的事情......

于 2012-05-11T16:18:19.327 回答