Я пишу небольшую программу управления временем для себя и столкнулся с проблемой, которая меня смутила.Строковое значение объектов задано неправильно
Их способ, которым он настроен, заключается в том, что у меня есть объект с именем TCObject
, который я использую в другом объекте под названием ProjectTimerController
. ProjectTimerController
- это NSWindowController
, и у него есть собственный файл NIB.
То, что я делаю, довольно прямолинейно. Когда вы нажимаете строку в NSTableView
, ProjectTimerController
находит TCObject
, который соответствует этой строке. Затем он загружает информацию с этого TCObject
в интерфейс, где вы можете просматривать и редактировать некоторые материалы.
Вот скриншот того, что он выглядит следующим образом:
Теперь, когда я изменить текст в NSTextView
, а затем нажмите кнопку Добавить функцию -saveString
называется и currentSelection
(который является TCObject
и представляет в настоящее время выбранная строка) и задана переменная нот. Я знаю, что _notes устанавливается как новое значение, так как функция NSLog регистрирует правильную строку, находящуюся в _notes при запуске setString
. То же самое, правильная строка записывается в -tableViewSelectionDidChange:
непосредственно перед тем, как currentSelection будет выбран как новый выбранный объект.
Но если я выберу строку, где я только что изменил заметки, она просто загружает один и тот же текст, «Начальная строка» и проверка _notes
говорит мне, что это «Начальная строка».
Вещь У меня нет этой проблемы с isFinished
. Когда установлен флажок «Готово», я устанавливаю соответствующее значение TCObjects
'isFinished
Boolean значение того же значения, что и флажок. Этот объект запоминает и правильно изменяется в зависимости от выбранной мной строки.
[EDIT]
* Здесь я добавил более четкое объяснение.
я нажимаю строку в NSTableView (позволяет сказать, что верхний)
Это загружает соответствующий TCObject из массива MyProjects и переменная этого объекта будут добавлены в поле Примечания NSTextView и Закончено является включен или выключен.
Если я сейчас напишу в поле «Примечания» и нажмите «Добавить», текст будет установлен в переменную _notes TCObject.
Так что если я нажму другую строку, в поле «Примечания» будет загружен другой текст. Нажатие на верхнюю строку должно дать мне строку, которую я только что написал в Notes на шаге 3. Но это не так. _notes всегда, кажется, содержит строку, которую я установил, когда я инициализирую ее в методе -init.
Флажок «Готово» отлично работает. Когда я нажимаю кнопку, состояние сохраняется и загружается правильно, когда я нажимаю строку.
Я знаю, что _notes правильно установлен, когда я нажимаю кнопку «Добавить», поскольку метод NSLog в SetString записывает строку, которую я записал в Notes, когда я нажимаю кнопку «Добавить».
[/ EDIT]
Здесь ниже скелетная версия 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];
}
Не могли бы вы сформулировать свою проблему более кратко? Я не уверен, что у вас проблемы с ... –
Жаль, что вчера я немного устал, когда написал ... Я отредактирую его и добавлю более четкое объяснение. – Bjorninn