2011-01-31 11 views
1

如果核心數據有一個具有特定成員變量值的對象,我將一個按鈕繪製到一個視圖;屏幕上可以同時顯示任意數量的這些按鈕。UI對象 - >核心數據關聯(繼承UIButton,添加實例變量)

如果用戶單擊該按鈕,我想獲取關聯的Core數據對象。

允許按鈕引用/調用核心數據對象的最佳方式是什麼?

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

編輯:

  • 按鈕創建將始終遵循管理對象的創建。
  • 按鈕創建也可以通過讀取核心數據來觸發,因此並不總是託管對象創建將繼續進行按鈕創建。

    1. 當我創建按鈕,我保存它,以確保它是一個非temperory UID,讀它的UID並將其存儲在一個varible(子類UIButton)。 (創建過程是可選的,請注意上面的2個項目符號)。這個想法是ccjensen正在研究的。

    2. 當我創建按鈕時,我存儲4-5個變量(子類UIButton),這將允許謂詞在Core數據中查找關聯的對象。

    3. 存儲激活鍵指針在字典中與CoreData ID

我贊成選項1,任何想法或方案?

回答

0

好的,我選擇了選項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 
+0

感謝您發佈代碼。 – ccjensen 2011-02-11 08:21:23

1

您是否考慮過使用KVO與視圖控制器(或任何負責創建/刪除按鈕)觀察感興趣的變量?

對於這個問題,你已經考慮過哪些方法?這可能會使您的問題更多地引起其他人的反饋。

1

儘管您沒有提供太多細節,但我的直接建議是在覈心數據對象中找到可用於按鈕「標識符」屬性的獨特屬性。我可能會使用managed objects id or URI representation

然後在您的按鈕處理程序方法中,您可以取出(id)發件人的標識符,並且應該爲您提供查找「屬於」該按鈕的特定管理對象的方法。