首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有自定义UITableViewCells的表单

带有自定义UITableViewCells的表单
EN

Stack Overflow用户
提问于 2016-03-12 17:29:47
回答 2查看 38关注 0票数 0

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

代码语言:javascript
复制
- (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一个模型,如下所示:

代码语言:javascript
复制
[[Restaurant alloc] initWithName:@"Name here" withNotifications:1 withFrequency:1 withDate:@"Date here" andWithDistance:@"Distance here"];

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-12 17:39:09

就像在所有细胞上循环一样有点过了头

它不仅是过分的,它是完全错误的。数据不是活在细胞里,而是活在数据中。模型,视图,控制器;单元就是视图!它的工作是表示模型(数据)。因此,应该没有什么可循环的;您应该已经将数据作为数据。

现在,当用户点击“保存”按钮时,我需要获取所有这些信息。

实际上,我要做的是在用户进行更改时捕获信息。为文本字段、开关或分段控制提供一个控制操作--目标,以便向您发送一条消息,告诉您发生了什么事情(例如,开关值发生了变化,文本被编辑,等等),然后立即捕获数据。

唯一的问题是:我收到了来自控件的一条消息:它在表的哪一行?要找出答案,请将层次结构从控件上移至单元格,然后询问表该单元格代表的行是什么:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-03-14 01:11:14

使用自定义块的更干净的方法。DetailTableViewCell.h

代码语言:javascript
复制
typedef void (^ saveBlock_block_t )(WhateverYourReturnObjectType *obj);

@interface DetailTableViewCell : UITableViewCell
- (void)configureCell:(NSString *)textFieldVal
               cellBlock:(saveBlock_block_t)cellBlock;
@end

DetailTableViewCell.m

代码语言:javascript
复制
@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

然后从cellForRowAtIndexPath叫它为-

代码语言:javascript
复制
[cell configureCell:@"John Appleseed”
      cellBlock:^(WhateverYourReturnObjectType *obj){

       //Do what you want to do with 'obj' which is returned by block instance in the cell
 }];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35960985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档