Объект пользовательского интерфейса -> Базовая ассоциация данных (подкласс UIButton, добавление переменной экземпляра) - PullRequest
1 голос
/ 31 января 2011

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

Если пользователь нажимает эту кнопку, я хочу получить связанный объект данных Core.

Каков наилучший способ позволить этому произойти с точки зрения разрешения кнопке ссылаться / вызывать основной объект данных?

У меня есть несколько собственных идей, но я хочу посмотреть, есть ли более быстрые / более эффективные методы.

Edit:

  • Создание кнопки всегда будет следовать за созданием управляемого объекта.
  • Создание кнопок также может быть инициировано считыванием данных ядра, поэтому не всегда создание управляемого объекта будет продолжено.

    1. Когда я создаю кнопку, я сохраняю ее, чтобы убедиться, что это не временный UID, прочитал ее UID и сохранил в переменной (Subclassing UIButton). (Процесс создания не обязателен, обратите внимание на 2 пункта выше). Эта идея - то, к чему стремится ccjensen.

    2. Когда я создаю кнопку, я сохраняю 4-5 переменных (подклассы UIButton), которые позволят предикату найти связанный объект в базовых данных.

    3. Сохранение активных указателей кнопок в словаре с идентификатором CoreData

Я бы предпочел вариант 1, есть мысли или альтернативы?

Ответы [ 3 ]

1 голос
/ 31 января 2011

Хотя вы не предоставляете много подробностей, я бы сразу предложил найти уникальное свойство в основных объектах данных, которое вы можете использовать для свойства идентификатора кнопок. Я бы, вероятно, использовал идентификатор управляемого объекта или URI-представление .

Затем в вашем методе обработчика кнопок вы можете извлечь идентификатор отправителя (id), и это даст вам возможность найти конкретный управляемый объект, который "принадлежит" этой кнопке.

1 голос
/ 31 января 2011

Рассматривали ли вы использование KVO с контроллером представления (или кто-то другой, ответственный за создание / удаление кнопок) для наблюдения интересующей переменной?

В этом отношении, какие подходы вы уже рассмотрели?Это может сделать ваш вопрос более привлекательным для обратной связи с другими.

0 голосов
/ 03 февраля 2011

Хорошо, я выбрал вариант 1 ...

Создание:

    SomeManagedObject * managedObj = (SomeManagedObject *)[NSEntityDescription insertNewObjectForEntityForName:@"SomeManagedObject" inManagedObjectContext:myManagedContext];

    NSError * er =  nil;    
    if(![myManagedContext save:&er])NSLog(@"ERROR:SAVE Error -%@",er);


    NSManagedObjectID *identifier = [managedObj objectID];

 CGPoint myPoint;//set point data

if(![identifier isTemporaryID]){
    CoreDataAwareButton * button = [CoreDataAwareButton buttonWithPosition:myPoint CoreDataId:identifier AndDelegate:self];

            [self.documentImage button];
    }
    else NSLog(@"Error-save error");

При печати:

-(void)pressCoreDataAwareButton:(id)sendr
{       
    CoreDataAwareButton * note = (CoreDataAwareButton *)sendr;  

    SomeManagedObject * obj = (SomeManagedObject*)[fetchObjectFromCoreDataWithID:note.coreDataIDentifier];
}

CoreDataAwareButton.h

#import <Foundation/Foundation.h>    
@interface CoreDataAwareButton : UIButton { 
    NSManagedObjectID * _coreDataIDentifier;    
}

@property(nonatomic,retain) NSManagedObjectID * coreDataIDentifier;

+(AnnotationButton*)buttonWithPosition:(CGPoint)point CoreDataId:(NSManagedObjectID*)identifier AndDelegate:(id)del;

@end

CoreDataAwareButton.m

#import "CoreDataAwareButton.h"
#import <objc/runtime.h>
@implementation CoreDataAwareButton
@synthesize coreDataIDentifier=_coreDataIDentifier;

+(CoreDataAwareButton*)buttonWithPosition:(CGPoint)point CoreDataId:(NSManagedObjectID*)identifier AndDelegate:(id)del{

    CoreDataAwareButton* button = [self buttonWithType:UIButtonTypeCustom];

    if (button && (class_getInstanceSize([button class]) == class_getInstanceSize([CoreDataAwareButton class]))) {

        button->isa = [CoreDataAwareButton class];//This looks dangerous, but its fine; credit: http://blog.jayway.com/2008/12/12/uibutton-troubles-and-obj-c-magic/                

        [button addTarget:del action:@selector(pressCoreDataAwareButton:) forControlEvents:UIControlEventTouchUpInside];
        button.frame = CGRectMake(point.x, point.y, 30, 30);
        //button.backgroundColor = [UIColor clearColor];
        UIImage *img = [UIImage imageNamed:@"annotation_icon_large.png"];       
        [button setImage:img forState:UIControlStateNormal];
        button.coreDataIDentifier = identifier;
    }
    return button;
}


-(void)dealloc{     
    [_coreDataIDentifier release];_coreDataIDentifier=nil;      
    [super dealloc];
}

@end
...