2011-06-09 53 views
0

在基於導航的應用程序中,我希望能夠在我詳細的產品視圖中擁有「克隆」或「另存爲」按鈕,其中用戶可以從他們已經輸入的現有產品之一創建新產品。在應用程序中,產品有很多屬性字段供用戶輸入,所以我想爲用戶提供快速「克隆」或「另存爲」任何現有產品的功能,這些產品會自動複製將現有產品的屬性覆蓋到新產品上,並允許用戶輸入新產品的名稱並保存。「克隆」或「另存爲」現有產品中的新產品

任何幫助如何實現這一點將不勝感激。謝謝。

+0

你嘗試過什麼?你有多遠?具體問題得到更好的答案。 – PengOne 2011-06-09 16:39:41

+0

我的rootview tableview列出了產品名稱,然後從中選擇產品名稱,彈出詳細的產品表格視圖,我可以在其中編輯該產品的任何單個屬性,該屬性彈出編輯控制器以進行任何屬性編輯。我只是不知道該從何處開始或着手從該詳細tableview中添加克隆/保存功能。 – EEE 2011-06-09 17:43:30

回答

0

我假設你正在使用核心數據,但你沒有特別提到這一點。從你的問題的角度來看,這似乎是有道理的。

將屬性從一個對象複製到另一個對象可能會非常棘手。我推薦一本關於Marcus Zarra的Core Data的書。你可以在這裏找到它http://pragprog.com/titles/mzcd/core-data

在他的書中,除了在導入和導出數據的情況下,他通過這個場景來貫穿整個場景,但代碼應該是類似的。以下是他的書籍站點提供的一些代碼(上圖)。這將所有屬性(包括關係)從一個對象複製到另一個對象。您還必須標識父對象的名稱才能正常工作。

此代碼不僅會複製屬性,還會複製關係,包括相關對象及其屬性。它工作得很好。

希望這會有所幫助!

- (void)copyPropertiesFromObject:(NSManagedObject*)oldObject 
        toObject:(NSManagedObject*)newObject 
         parent:(NSString*)parentEntity { 

NSString *entityName = [[oldObject entity] name]; 
NSArray *attKeys = [[[oldObject entity] attributesByName] allKeys]; 
NSDictionary *attributes = [oldObject dictionaryWithValuesForKeys:attKeys]; 
[newObject setValuesForKeysWithDictionary:attributes]; 
//END:copyPropertiesFromObjectProperties 

//START:copyPropertiesFromObjectRelationships 
id oldDestObject = nil; 
id temp = nil; 
NSDictionary *relationships = [[oldObject entity] relationshipsByName]; 
for (NSString *key in [relationships allKeys]) { 
    NSRelationshipDescription *desc = [relationships valueForKey:key]; 
    NSString *destEntityName = [[desc destinationEntity] name]; 
    if ([destEntityName isEqualToString:parentEntity]) continue; 

    if ([desc isToMany]) { 
     NSMutableSet *newDestSet = [NSMutableSet set]; 
     for (oldDestObject in [oldObject valueForKey:key]) { 
      temp = [[self lookup] objectForKey:[oldDestObject objectID]]; 
      if (!temp) { 
       temp = [self associateObject:oldDestObject 
          parent:entityName]; 
      } 
      [newDestSet addObject:temp]; 
     } 
     [newObject setValue:newDestSet forKey:key]; 
    } else { 
     oldDestObject = [oldObject valueForKey:key]; 
     if (!oldDestObject) continue; 
     temp = [[self lookup] objectForKey:[oldDestObject objectID]]; 
     if (!temp) { 
      temp = [self associateObject:oldDestObject 
            parent:entityName]; 
     } 
     [newObject setValue:temp forKey:key]; 
    } 
} 
} 

這:

- (id)associateObject:(NSManagedObject*)object parent:(NSString*)name { 

NSManagedObjectContext *moc = [self mainContext]; 
NSString *entityName = [[object entity] name]; 
id temp = nil; 

if ([entityName isEqualToString:@"Title"]) { 
    temp = [NSEntityDescription insertNewObjectForEntityForName:entityName 
            inManagedObjectContext:moc]; 
    [[self lookup] setObject:temp forKey:[object objectID]]; 
    [self copyPropertiesFromObject:object toObject:temp parent:name]; 
    return temp; 
} 

if ((temp = [self objectOfType:entityName 
        withName:[object valueForKey:@"name"]])) { 
    [[self lookup] setObject:temp forKey:[object objectID]]; 
    return temp; 
} 

temp = [NSEntityDescription insertNewObjectForEntityForName:entityName 
            inManagedObjectContext:moc]; 
[[self lookup] setObject:temp forKey:[object objectID]]; 
[self copyPropertiesFromObject:object toObject:temp parent:name]; 
return temp; 
} 
+0

抱歉,您的反應遲緩。我出去度假了。這是很好的信息,我非常感謝你的幫助。這看起來像是要讓我走下正確的道路,正是我想要做的。也感謝Marcus Zarra的書。我查了一下,它看起來像一個很好的資源,所以我一定會得到一個副本。再次感謝,非常感謝。 – EEE 2011-06-20 19:02:15

+0

很酷。我希望你是最好的。如果你喜歡我的回答,我會很感激,如果你願意接受它! :) – jschmidt 2011-06-20 19:46:35

相關問題