我正在建立一個視圖控制器,我在其中以編程方式添加一串UITextField
到我的視圖。我想用我從CoreData加載的一些文本預先填充文本字段,但允許用戶進入並更改文本(如果他們想要的話)。然後我需要返回並再次將新文本保存回CoreData,並使用新值執行計算。保存和加載本身不是問題,但我正在尋找一種跟蹤用戶變化的好方法。有沒有辦法將UITextField自動綁定到我的數據模型中的變量?
在過去,我已使用UITextField
和textFieldDidEndEditing:
委託方法的.tag
屬性完成此操作。問題是我在這個視圖中會有幾十個文本框 - 足以讓我不記得.tag
屬於我模型中的變量。當我創建它時,不得不回頭查看我分配的標籤是一件痛苦的事情,而整件事情真的很容易出錯。另外,我將在多個不同的循環中創建文本字段,因此,在創建文本字段時爲每個文本字段獲取唯一標記將很困難(也許不可能?)。
我正在尋找的是一種將UITextField「綁定」到我的模型中的變量的方法,當我創建它時,只要知道該點,每當用戶更新該文本字段時,我在我的模型將立即更新以供將來計算使用,並在用戶離開屏幕時保存回CoreData。有沒有辦法做到這一點?
編輯1:另外要注意的是,我的模型本身有點複雜。我有幾個不同的自定義NSObject
子類,它們都擁有不同的數據。一些對象具有本身是其他自定義對象的屬性。我也有字典,其中的值將是一些自定義對象的實例。
作爲一個例子,可能我這些對象:
MySmallObject1
,其具有的屬性name
,size
,和value
(所有NSStrings
)MySmallObject2
,其具有的屬性date
和cost
(一個NSDate
和NSNumber
)MyBigObject
,其具有性質box1
和box2
(w HICH是MySmallObject1
和MySmallObject2
情況下,分別)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];
}
凡globalCounter
是int
我正在遞增每次我東西放在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世界中如何工作仍然有點模糊,我認爲我還沒有完全理解。
添加抽象層 - 如何使用字典將所有內容映射到一起? – Till
@Till:我編輯了一些關於我的模型的更多細節。我認爲在這種情況下字典不起作用,因爲我無法將整棵樹存儲爲'key',對嗎? – GeneralMike
我只能看到兩種基本方法:1.使用標籤,2.在數據模型中使用指向視圖的實例指針。在大多數情況下,肯定是醜陋和純粹的錯誤。因此,讓我們稍微檢查1 ...該標記可能是您模型的生成值。假設MySmallObject1在被詢問時呈現一個唯一的值(我們稱之爲Object-ID)。現在建立一個哈希映射(aka字典),將ID鏈接回控制器中的對象 - 這是否有意義? – Till