【问题标题】:UI object -> Core Data association (Subclassing UIButton, adding instance variable)UI 对象 -> 核心数据关联(子类化 UIButton,添加实例变量)
【发布时间】:2011-01-31 17:08:46
【问题描述】:

如果核心数据有一个具有特定成员变量值的对象,我会在视图中绘制一个按钮;屏幕上可以同时出现任意数量的这些按钮。

如果用户单击该按钮,我想获取关联的核心数据对象。

就允许按钮引用/调用核心 Data 对象而言,实现这种情况的最佳方法是什么?

我有一些自己的想法,但想看看有没有更快/更有效的方法。

编辑:

  • 按钮的创建将始终跟随托管对象的创建。
  • 按钮创建也可以通过读取核心数据来触发,因此托管对象创建并不总是会继续按钮创建。

    1. 当我创建按钮时,我保存它以确保它是一个非临时 UID,读取它的 UID 并将它存储在一个变量中(子类化 UIButton)。 (创建过程是可选的,请注意上面的 2 个项目符号)。这个想法就是 ccjensen 的目标。

    2. 当我创建按钮时,我存储了 4-5 个变量(子类化UIButton),这些变量将允许谓词在核心数据中找到关联的对象。

    3. 将活动按钮指针存储在具有 CoreData ID 的字典中

我赞成选项 1,有什么想法或替代方案吗?

【问题讨论】:

    标签: iphone objective-c ipad ios core-data


    【解决方案1】:

    您是否考虑过将 KVO 与视图控制器(或任何负责创建/删除按钮的设备)一起使用来观察感兴趣的变量?

    就此而言,您已经考虑过哪些方法?这可能会使您的问题更能吸引其他人的反馈。

    【讨论】:

      【解决方案2】:

      虽然您没有提供太多细节,但我的直接建议是在核心数据对象中找到一个独特的属性,您可以将其用于按钮的“标识符”属性。我可能会使用managed objects id or URI representation

      然后在您的按钮处理程序方法中,您可以提取 (id)sender 的标识符,这应该可以让您找到“属于”该按钮的特定托管对象。

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 2017-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-18
          相关资源
          最近更新 更多