使用自定义UITableViewCells的表单

时间:2016-03-12 17:29:48

标签: ios objective-c uitableview

我的应用中有一个表单存在于UITableView的自定义单元格中。这些单元格可以包含UITextFieldUISegmentedControlUISwitch。我就是这样设置的:

- (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"];

将所有这些输入转换为模型中的数据的最佳和最干净的方法是什么?我觉得循环遍历所有细胞有点过头了。

2 个答案:

答案 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"