2015-09-14 2 views
1

Это сводит меня с ума немного ..NSTableView + NSTextView = Disaster :(

вниз ниже скриншот моей программы до сих пор.

Справа является NSTableView (вид на основе). Здесь пользователь может выбрать документ, который они хотят работать.

слева является NSTextView. Текст будет отображаться в зависимости от того, какой элемент они выбирают в NSTableView.

есть также большой плюс и минус кнопки для создания/удаления новых элементов в таблице Посмотреть.

Простое право? Я хочу.

enter image description here

Сейчас у меня есть это так TableView получает данные от изменяемого массива. Изменчивый массив содержит объекты класса DocumentItem. DocumentItem имеет две строки: одну для текста документа и одну для названия документа.

Что работает до сих пор:

Когда я вручную добавлять объекты в массив с помощью кода, я могу свободно переключаться с документами и TextView будет обновляться соответственно.

Что не работает:

Когда пользователь переключается на другой документ, я хочу, чтобы вызвать метод replaceObjectAtIndex NSTableView сохранить изменения, которые они внесли в объект в массиве.

Как мой код работает до сих пор:

изменяемый массив хранится в классе данных. Класс данных является общим классом и упоминается в моем коде как DATA.

У меня есть цикл цикла в моем классе, который имеет textview. В моем классе tableview у меня есть метод под названием blastToScreen, который изменит BOOL с именем shouldBLAST на YES.

Вот код в моем классе TableController установить BOOL в YES:

- (void) blastToScreen{ 

    theDATA.blasttext = [[theDATA.globaldoclist objectAtIndex:[tablevieww selectedRow]] doccontents]; 
    theDATA.shouldBLAST=YES; 

} 

Вот метод shouldBLAST в моей петельные нити (в другом классе от TextView). Обратите внимание, что if-statement, в котором указано if(theDATA.switchedrow), должен убедиться, что определенный код запускается только тогда, когда пользователь переключает свою строку в представлении таблицы.

if(theDATA.shouldBLAST){ 

     if(theDATA.switchedrow){ 
      DocumentItem * itemr = [theDATA.globaldoclist objectAtIndex:theDATA.lastindex]; 

      NSLog(@"(%li) prev content - >%@",(long)theDATA.lastindex,itemr.doccontents); 

      itemr.doccontents=textvieww.string; 

      NSLog(@"(%li)adding content - > %@ <- to %@",theDATA.lastindex, itemr.doccontents,itemr.docname); 

      theDATA.switchedrow=NO; 
      [theDATA.globaldoclist replaceObjectAtIndex:theDATA.lastindex withObject:itemr ]; 

      NSLog(@"changed: - > %@",[[theDATA.globaldoclist objectAtIndex:theDATA.lastindex] doccontents]); 

     } 





      textvieww.string=theDATA.blasttext; 
      theDATA.shouldBLAST=NO; 
     NSLog(@"changed: - > %@",[[theDATA.globaldoclist objectAtIndex:theDATA.lastindex] doccontents]); 
     theDATA.lastindex=theDATA.selectedrow; 



    } 

Вот странная часть обо всем этом:

Согласно заявлениям NSLog я установил, мой код работает на долю секунды, а затем сбрасывает.

Внизу, что говорит консоль. игнорировать (0). это просто говорит о последнем выбранном индексе.

Это означает, что текст перед переключением был ничем (прекрасным). Он говорит, что добавляет в этот массив текст «Картофель» (все еще отлично). Затем, в первый раз, когда я извлек объект из массива, он показывает, что он успешно изменился на «Картофель» (все еще отлично). Затем, когда я попытался получить ТОЧНЫЕ точные данные несколькими строками позже, он ничего не вернул. .. :(

Я чувствую, что вопрос находится где-то в моем классе TableController Here's a link к коду в моем классе TableController

Вот что вернулся консоль:

2015-09-14 17:17:46.024 Simplicity[4801:432580] (0) prev content - > 
2015-09-14 17:17:46.025 Simplicity[4801:432580] (0)adding content - > Potato <- to Untitled 
2015-09-14 17:17:46.025 Simplicity[4801:432580] changed: - > Potato 
2015-09-14 17:17:46.025 Simplicity[4801:432580] changed: - > 

Я действительно надеюсь, что вы, ребята, можете помогите мне. Я пробовал почти все, что мог, чтобы решить эту проблему. Это удерживает меня от завершения моего программного обеспечения.

+0

трудно помочь, не зная, что такое 'theDATA.globaldoclist', можете ли вы зарегистрировать это значение? – aug2uag

+1

@ aug2uag globaldoclist - это общий массив, который я использую для nstableview. –

+0

Еще одна катастрофа - это длительность презентации вашей проблемы. Сделайте это кратким. Никто не собирается тратить больше 30 секунд на чтение проблемы, которую кто-то другой. –

ответ

3

Возможно, свойство doccontents вашего DocumentItem класса - strong (или retain) когда это должно быть copy.

Из docs for the string property of NSText (из которого NSTextView наследует):

По причинам производительности, этот метод возвращает текущее резервное хранилище текстового объекта. Если вы хотите сохранить снимок этого при манипулировании текстовым хранилищем, вы должны сделать копию соответствующей подстроки.

Итак, если вы просто сохраняете ссылку на тот же объект, когда содержимое текстового представления изменяется, содержимое объекта, на которое вы ссылаетесь, также изменяется. Вам нужно сделать частную копию.

+0

Большое спасибо! Я не могу поверить, что 2-секундное изменение зафиксировало это. Мне нужно еще кое-что узнать о свойствах. Ты спасатель жизни! –

Смежные вопросы