2013-06-21 2 views
0

У меня есть набор атрибутов, которые отображаются в Tableview через контроллер массива (все привязки), я написал код для изменения одного из атрибутов на основе содержимого других. Я написал это в файле .m, что данные Основные созданный для этого объекта:Изменение атрибута сущности, отображаемого в таблице через контроллер массива

Заголовок:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class Instrument; 

@interface IO : NSManagedObject 

@property (nonatomic, retain) NSNumber * channel; 
@property (nonatomic, retain) NSString * depiction; 
@property (nonatomic, retain) NSString * prefix; 
@property (nonatomic, retain) NSNumber * rack; 
@property (nonatomic, retain) NSNumber * slot; 
@property (nonatomic, retain) NSString * suffix; 
@property (nonatomic, retain) NSString * tag; 
@property (nonatomic, retain) NSString * type; 
@property (nonatomic, retain) NSString * depictionFull; 
@property (nonatomic, retain) Instrument *io_instrument; 

@end 

главная:

#import "IO.h" 
#import "Instrument.h" 
#import "Loop.h" 
#import "Area.h" 


@implementation IO { 
} 

@dynamic channel; 
@dynamic depiction; 
@dynamic prefix; 
@dynamic rack; 
@dynamic slot; 
@dynamic suffix; 
@dynamic tag; 
@dynamic type; 
@dynamic depictionFull; 
@dynamic io_instrument; 

- (void)awakeFromFetch{ 

    [self setDepictionFull:[NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction]]; 
} 

@end 

две проблемы:

  1. Thi s меняет только значение таблицы «view» моего атрибута, но не фактическое сохраненное значение (я знаю это, потому что, когда я комментирую код, значение не сохраняется)

  2. Функция «awakeFromFetch», которую я использую только применяет код, когда я извлекаю данные, но также хотел бы, чтобы он обновлялся при изменении любого атрибута в сущности (или контроллере массива).

ответ

0

Лучший способ сделать это - не сохранять значение depictionFull, а скорее возвращать его по запросу.

- (NSString *)dipictionFull { 
    return [NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction]; 
} 

Таким образом, он всегда будет возвращать новейшее значение, несмотря ни на что! Он работает ленивым способом, с которым iOS и объектив-c имеют тенденцию работать хорошо. Это [вообще] не плохая идея делать, когда атрибуты или свойства полностью зависят от других свойств или атрибутов.

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

И последнее, Вы не должны помещать этот код в свой текущий подкласс NSManagedObject. Что делать, если вы добавляете атрибут и хотите воссоздать этот класс? Затем (если вы используете инструмент создания XCodes), он полностью уничтожит ваш пользовательский awakeFromFetch. Вместо этого создайте category для IO и разместите там свой код. Затем, если вам нужно воссоздать свою реализацию NSManagedObject, ваша категория не изменится.

UPDATE - как использовать категории

Для создания категории перейдите к файл ->новый ->файл (или команда + N), то при Cocoa Touch выберите объективно- C категория. Назовите свою категорию AddOn (или что-то в этом роде) и под Категория на введите подкласс NSManagedObject (в данном случае Instrument). После этого поместите метод -(NSString *)dipictionFull; в .h и указанную выше реализацию в .m. Затем, когда вы захотите использовать этот метод, импортируйте Instrument+AddOn.h в класс, который нуждается в dipictionFull.Затем просто назовите его [self.myInstrument dipictionFull], и вы получите свою строку, которая всегда актуальна, потому что она постоянно вытаскивает значения.

+0

Я понимаю значение использования указанной выше функции, но моя проблема заключается в том, чтобы знать, где я ее запрашиваю. Кроме того, как я могу явно что-то сохранить? Причина, по которой я разместил свой код в этом объекте, заключается в том, что я обнаружил, что это единственное место, которое изменило все соответствующие значения в моей таблице. Мои извинения, я очень новичок в таких программах :) – Canto

+0

@Canto Я добавил некоторую информацию в свой ответ, посмотрим, поможет ли это вам. Я не совсем уверен, что вы спрашиваете, поэтому я только догадывался. – Firo

+0

Спасибо Firo! Я внес изменения, которые вы рекомендовали: -Модули код к отдельному классу объектов -Можно применять/сохранять изменения в моем атрибуте, но только для одного. Невозможно применить изменения ко всем тем же атрибутам в организация. – Canto