对象字符串值未正确设置

时间:2012-05-10 18:06:31

标签: objective-c macos cocoa

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

它们设置的方式是我有一个名为TCObject的对象,我在另一个名为ProjectTimerController的对象中使用它。 ProjectTimerControllerNSWindowController,它有自己的NIB文件。

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

Screenshot

现在当我更改NSTextView中的文字然后按添加按钮时,系统会调用-saveString功能并currentSelectionTCObject代表当前选中的setString line)并设置了notes的变量。我知道_notes被设置为新值,因为NSLog函数在-tableViewSelectionDidChange:运行时记录_notes中正确的字符串。就在将currentSelection设置为新选择的对象之前,_notes中记录了相同的正确字符串。

但是,如果我选择我刚刚更改了注释的行,它只会加载相同的文本,“Initial String”并检查isFinished告诉我它是“Initial String”。

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

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

  1. 我单击NSTableView中的一行(比如说顶部的一行)

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

  3. 如果我现在写入“备注”框并按“添加”文本,则会设置为TCObject的_notes变量。

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

  5. “已完成”复选框正常工作。单击一行时单击该状态并正确加载。

  6. 我知道当我按下Add按钮时_notes被正确设置,因为当我按下Add按钮时,setString中的NSLog方法会记录我写入Notes的字符串。

  7. [/ EDIT]

    以下是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];
    }
    
    {{1}}

1 个答案:

答案 0 :(得分: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也发生了变化或类似的事情......