【问题标题】:UI object -> Core Data association (Subclassing UIButton, adding instance variable)UI 对象 -> 核心数据关联(子类化 UIButton,添加实例变量)
【发布时间】:2011-01-31 17:08:46
【问题描述】:
如果核心数据有一个具有特定成员变量值的对象,我会在视图中绘制一个按钮;屏幕上可以同时出现任意数量的这些按钮。
如果用户单击该按钮,我想获取关联的核心数据对象。
就允许按钮引用/调用核心 Data 对象而言,实现这种情况的最佳方法是什么?
我有一些自己的想法,但想看看有没有更快/更有效的方法。
编辑:
我赞成选项 1,有什么想法或替代方案吗?
【问题讨论】:
标签:
iphone
objective-c
ipad
ios
core-data
【解决方案1】:
您是否考虑过将 KVO 与视图控制器(或任何负责创建/删除按钮的设备)一起使用来观察感兴趣的变量?
就此而言,您已经考虑过哪些方法?这可能会使您的问题更能吸引其他人的反馈。
【解决方案3】:
好的,我选择了选项 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