我正在为自己编写一个小型的项目时间管理程序,并遇到一个令我感到困惑的问题。
它们设置的方式是我有一个名为TCObject
的对象,我在另一个名为ProjectTimerController
的对象中使用它。 ProjectTimerController
是NSWindowController
,它有自己的NIB文件。
我正在做的事情非常简单。当您点击NSTableView
ProjectTimerController
中的一行时,会找到与该行对应的TCObject
。然后,它会将TCObject
中的信息加载到一个界面中,您可以在其中查看和编辑某些内容
这是一个截图:
现在当我更改NSTextView
中的文字然后按添加按钮时,系统会调用-saveString
功能并currentSelection
(TCObject
代表当前选中的setString
line)并设置了notes的变量。我知道_notes被设置为新值,因为NSLog函数在-tableViewSelectionDidChange:
运行时记录_notes中正确的字符串。就在将currentSelection设置为新选择的对象之前,_notes
中记录了相同的正确字符串。
但是,如果我选择我刚刚更改了注释的行,它只会加载相同的文本,“Initial String”并检查isFinished
告诉我它是“Initial String”。
我对TCObjects
没有这个问题。切换完成复选框后,我将相应的isFinished
'TCObject
布尔值设置为与复选框相同的值。根据我选择的行,对象会记住并正确更改。
[编辑]
*我在这里添加了更清晰的解释。
我单击NSTableView中的一行(比如说顶部的一行)
这将从myProjects数组加载相应的TCObject,并将该对象的变量添加到Notes NSTextView框中,并打开或关闭Finished。
如果我现在写入“备注”框并按“添加”文本,则会设置为TCObject的_notes变量。
因此,如果我单击另一行,其他文本将加载到“注释”框中。点击返回顶行应该给我在第3步中写入Notes的字符串。但它没有。 _notes似乎总是包含我在-init方法中初始化时设置的字符串。
“已完成”复选框正常工作。单击一行时单击该状态并正确加载。
我知道当我按下Add按钮时_notes被正确设置,因为当我按下Add按钮时,setString中的NSLog方法会记录我写入Notes的字符串。
[/ 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}}
答案 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也发生了变化或类似的事情......