2012-05-10 6 views
0

Я пишу небольшую программу управления временем для себя и столкнулся с проблемой, которая меня смутила.Строковое значение объектов задано неправильно

Их способ, которым он настроен, заключается в том, что у меня есть объект с именем TCObject, который я использую в другом объекте под названием ProjectTimerController. ProjectTimerController - это NSWindowController, и у него есть собственный файл NIB.

То, что я делаю, довольно прямолинейно. Когда вы нажимаете строку в NSTableView, ProjectTimerController находит TCObject, который соответствует этой строке. Затем он загружает информацию с этого TCObject в интерфейс, где вы можете просматривать и редактировать некоторые материалы.
Вот скриншот того, что он выглядит следующим образом:

Screenshot

Теперь, когда я изменить текст в NSTextView, а затем нажмите кнопку Добавить функцию -saveString называется и currentSelection (который является TCObject и представляет в настоящее время выбранная строка) и задана переменная нот. Я знаю, что _notes устанавливается как новое значение, так как функция NSLog регистрирует правильную строку, находящуюся в _notes при запуске setString. То же самое, правильная строка записывается в -tableViewSelectionDidChange: непосредственно перед тем, как currentSelection будет выбран как новый выбранный объект.

Но если я выберу строку, где я только что изменил заметки, она просто загружает один и тот же текст, «Начальная строка» и проверка _notes говорит мне, что это «Начальная строка».

Вещь У меня нет этой проблемы с isFinished. Когда установлен флажок «Готово», я устанавливаю соответствующее значение TCObjects 'isFinished Boolean значение того же значения, что и флажок. Этот объект запоминает и правильно изменяется в зависимости от выбранной мной строки.

[EDIT]
* Здесь я добавил более четкое объяснение.

  1. я нажимаю строку в NSTableView (позволяет сказать, что верхний)

  2. Это загружает соответствующий TCObject из массива MyProjects и переменная этого объекта будут добавлены в поле Примечания NSTextView и Закончено является включен или выключен.

  3. Если я сейчас напишу в поле «Примечания» и нажмите «Добавить», текст будет установлен в переменную _notes TCObject.

  4. Так что если я нажму другую строку, в поле «Примечания» будет загружен другой текст. Нажатие на верхнюю строку должно дать мне строку, которую я только что написал в Notes на шаге 3. Но это не так. _notes всегда, кажется, содержит строку, которую я установил, когда я инициализирую ее в методе -init.

  5. Флажок «Готово» отлично работает. Когда я нажимаю кнопку, состояние сохраняется и загружается правильно, когда я нажимаю строку.

  6. Я знаю, что _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]; 
} 
+0

Не могли бы вы сформулировать свою проблему более кратко? Я не уверен, что у вас проблемы с ... –

+0

Жаль, что вчера я немного устал, когда написал ... Я отредактирую его и добавлю более четкое объяснение. – Bjorninn

ответ

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. Поэтому, когда я изменил текст, там тоже были изменены или что-то в этом роде ...