2013-08-06 45 views
4

我正在建立一個視圖控制器,我在其中以編程方式添加一串UITextField到我的視圖。我想用我從CoreData加載的一些文本預先填充文本字段,但允許用戶進入並更改文本(如果他們想要的話)。然後我需要返回並再次將新文本保存回CoreData,並使用新值執行計算。保存和加載本身不是問題,但我正在尋找一種跟蹤用戶變化的好方法。有沒有辦法將UITextField自動綁定到我的數據模型中的變量?

在過去,我已使用UITextFieldtextFieldDidEndEditing:委託方法的.tag屬性完成此操作。問題是我在這個視圖中會有幾十個文本框 - 足以讓我不記得.tag屬於我模型中的變量。當我創建它時,不得不回頭查看我分配的標籤是一件痛苦的事情,而整件事情真的很容易出錯。另外,我將在多個不同的循環中創建文本字段,因此,在創建文本字段時爲每個文本字段獲取唯一標記將很困難(也許不可能?)。

我正在尋找的是一種將UITextField「綁定」到我的模型中的變量的方法,當我創建它時,只要知道該點,每當用戶更新該文本字段時,我在我的模型將立即更新以供將來計算使用,並在用戶離開屏幕時保存回CoreData。有沒有辦法做到這一點?

編輯1:另外要注意的是,我的模型本身有點複雜。我有幾個不同的自定義NSObject子類,它們都擁有不同的數據。一些對象具有本身是其他自定義對象的屬性。我也有字典,其中的值將是一些自定義對象的實例。

作爲一個例子,可能我這些對象:

  • MySmallObject1,其具有的屬性namesize,和value(所有NSStrings
  • MySmallObject2,其具有的屬性datecost(一個NSDateNSNumber
  • MyBigObject,其具有性質box1box2(w HICH是MySmallObject1MySmallObject2情況下,分別)
  • theDict,這是具有MyBigObject S作爲值的NSDictionary實例

所以,當我建立我的文本框,我實際上可能會下降一棵樹,將看是這樣的:

for (NSString *key in [theDict allKeys]) 
{ 
    UITextField *txt = [[UITextField alloc] initWithFrame:...]; 
    txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; 
    [self.view addSubview:txt]; 
} 

在這種情況下,我需要當用戶更改在任何txt的文本,並通過更新樹中適當的值就知道了。

編輯2:當試圖在評論中實現@ Till的建議時,我開始閱讀tutorial on pointers in C。看起來這是我需要去的方式,但我努力從C世界獲得的&*與我在Objective-C世界的最後編輯中提到的NSObject子類很好地搭配。爲了讓@ Till的建議可行,我想我需要以某種方式將我的價值的內存位置存儲在複雜的對象樹中。所以從最後的編輯我的代碼塊將成爲:

.h 
@property (nonatomic, strong) NSMutableDictionary *tagDict; 

.m 
for (NSString *key in [theDict allKeys]) 
{ 
    UITextField *txt = [[UITextField alloc] initWithFrame:...]; 
    txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; 
    txt.tag = globalCounter; 
    [tagDict addObject:[[(MyBigObject *)[theDict objectForKey:key] box1] name] forKey:[NSString stringWithFormat:@"%d",globalCounter]]; 
    globalCounter ++; 
    [self.view addSubview:txt]; 
} 

globalCounterint我正在遞增每次我東西放在tagDict時間,所以我可以保持它的獨特。我想在這種情況下,我可能只是簡單地使用NSArray,它會工作得很好,並可能看起來更清潔。我的計劃是在我的testFieldDidEndEditing喜歡用tagDict

- (void) textFieldDidEndEditing:(UITextField *)textField 
{ 
    *[tagDict objectForKey:[NSString stringWithFormat:@"%d",textField.tag]] = textField.txt; 
} 

這將引發錯誤的Assigning to 'id' from incompatible type 'NSString *'。我不確定這意味着什麼。有沒有一種方法可以使用「取消引用操作符」來更改我在詞典中指向的項目的值?

將引發錯誤Address expression must be an lvalue or a function designator。我仍然對這個指針在Objective C世界中如何工作仍然有點模糊,我認爲我還沒有完全理解。

+0

添加抽象層 - 如何使用字典將所有內容映射到一起? – Till

+0

@Till:我編輯了一些關於我的模型的更多細節。我認爲在這種情況下字典不起作用,因爲我無法將整棵樹存儲爲'key',對嗎? – GeneralMike

+0

我只能看到兩種基本方法:1.使用標籤,2.在數據模型中使用指向視圖的實例指針。在大多數情況下,肯定是醜陋和純粹的錯誤。因此,讓我們稍微檢查1 ...該標記可能是您模型的生成值。假設MySmallObject1在被詢問時呈現一個唯一的值(我們稱之爲Object-ID)。現在建立一個哈希映射(aka字典),將ID鏈接回控制器中的對象 - 這是否有意義? – Till

回答

0

我最終做了很多我認爲@Till試圖建議的事情。我向我的視圖控制器添加了NSMutableArray *tieArrayint tieCounter作爲@properties。我從我的OP的第一個代碼塊構建UITextFields代碼現在:

for (NSString *key in [theDict allKeys]) 
{ 
    UITextField *txt = [[UITextField alloc] initWithFrame:...]; 
    txt.text = [[(MyBigObject *)[theDict objectForKey:key] box1] name]; 
    [self.view addSubview:txt]; 

    txt.tag = self.tieCounter; 
    self.tieCounter ++; 
    [self.tieArray addObject:[[(MyBigObject *)[theDict objectForKey:key] box1] name]]; 
} 

然後在我的textFieldDidEndEditing

- (void) textFieldDidEndEditing:(UITextField *)textField 
{ 
    if ([tieArray objectAtIndex:textField.tag] isKindOfClass:[NSMutableString class]]) 
    { 
     [(NSMutableString *)[tieArray objectAtIndex:textField.tag] setString:textField.text]; 
    } 
    else if (//...More conditions to set other variable types with the syntax as needed) 
} 

需要注意的是這個工作的MySmallObject1MySmallObject2需要的所有屬性由isKindOfClass:檢查覆蓋,實際的語法會有所不同,取決於該屬性是什麼類。

我還沒有能夠測試這一點(和我的應用程序可能不會處於可測試狀態很長一段時間),但它對我來說是有意義的,它不會拋出任何錯誤或警告。如果我在運行時遇到問題,我會在這裏更新。

0

您可以使用UITextField+blocks它可能不太糾纏。如果對象具有相似的接口或者使用像setText:這樣的方法實現一個協議,則會更容易。

+0

有沒有這個文件?我不習慣使用塊,所以我不確定我應該怎麼做,這將幫助我。 – GeneralMike

0

你可以使用原始的方法與.tag,但使用typedefs。

typedef enum TFTypes { 
    TFModalType1, 
    TFModalType2, 
    TFModalType3, 
    TFModalType4, 
    TFModalType5, 
    ... 
} TFType; 
+0

使用typedefs將有助於使標籤感覺不那麼隨意,但我不認爲這將有助於我將數據存儲在對象中的方式,這與我在編輯OP中描述的方式相同。 – GeneralMike

相關問題