我的应用中有一个表单存在于UITableView
的自定义单元格中。这些单元格可以包含UITextField
,UISegmentedControl
或UISwitch
。我就是这样设置的:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 5;
}
- (UITableViewCell *)tableView:(UITableView *)tableViewInner cellForRowAtIndexPath:(NSIndexPath *)indexPath {
DetailTableViewCell *cell;
static NSString *MyIdentifier = @"MyIdentifier";
DetailTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[DetailTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
}
[cell setTextField:@"John Appleseed"];
// or
[cell setSegment];
[cell setSegmentIndex:1];
// or
[cell setSwitch];
[cell setSwitchEnabled:YES];
return cell;
}
现在,当用户点击保存按钮时,我需要获取所有这些信息并init
一个模型,如下所示:
[[Restaurant alloc] initWithName:@"Name here" withNotifications:1 withFrequency:1 withDate:@"Date here" andWithDistance:@"Distance here"];
将所有这些输入转换为模型中的数据的最佳和最干净的方法是什么?我觉得循环遍历所有细胞有点过头了。
答案 0 :(得分:1)
像在所有单元格上循环一样,有点超过顶部
它不仅仅是顶部:它完全错了。数据并不存在于细胞中;它存在于数据中。模型,视图,控制器;单元格只是 view !它的工作是表示模型(数据)。因此,应该没有什么可以循环的;你应该已经将数据作为数据。
现在,当用户点击保存按钮时,我需要获取所有这些信息
实际上,我要做的是在用户进行更改时捕获信息。为文本字段,开关或分段控件提供控制操作目标,以便向您发送消息,告诉您发生了某些事情(例如,切换值已更改,文本已编辑等)并立即捕获数据
然后唯一的问题是:我收到了来自控件的消息:该表的哪一行是什么?为了找到答案,从控件中走出层次结构直到你进入单元格,然后询问表格这个单元格代表的行:
UIView* v = sender; // the control
do {
v = v.superview;
} while (![v isKindOfClass: [UITableViewCell class]]);
UITableViewCell* cell = (UITableViewCell*)v;
NSIndexPath* ip = [self.tableView indexPathForCell:cell];
答案 1 :(得分:0)
使用自定义块的更清洁方法。 DetailTableViewCell.h
@interface DetailTableViewCell ()
{
@property (copy, nonatomic) saveBlock_block_t saveBlock;
}
@end
@implementation DetailTableViewCell
- (void)configureCell:(NSString *)textFieldVal
cellBlock:(saveBlock_block_t)cellBlock
{
[cell setTextField: textFieldVal];
[self setSaveBlock:cellBlock];
}
-(IBAction)saveButtonAction:(id)sender //Action on your save button
{
self.cellBlock(obj); // Whatever object you want to return to class having your table object
}
@end
DetailTableViewCell.m
[cell configureCell:@"John Appleseed”
cellBlock:^(WhateverYourReturnObjectType *obj){
//Do what you want to do with 'obj' which is returned by block instance in the cell
}];
然后从cellForRowAtIndexPath将其称为 -
some_string = "[quote=\"user.name, post:1, topic:14\"] some other content here"