美文网首页很常
iOS 如何循环遍历cell

iOS 如何循环遍历cell

作者: 宥落 | 来源:发表于2021-03-09 17:47 被阅读0次

    首先说明:遍历所有cell不可取

    如题也可以说是如何开发多条件输入视图、条件选择视图。

    需求如图所示,样例只列举几个信息,实际项目中可能有很多个。这里需要将用户输入的信息,组装后一起保存。没碰过这种需求的大多都会考虑使用UITableView,使用之后问题来了

    问题:输入完成如何获取用户输入的内容?

    先在UITableViewCell的.h文件中声明属性

    @property (nonatomic, strong) UITextField *textField;
    @property (nonatomic, strong) UITextView *textView;
    

    在提交时循环遍历获取:

    - (void)save{
        for (int i = 0; i < 6; i++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
            NSString *stirng = cell.textFiled;
        }
    }
    

    如果你这样做了,那你从一开始就错了,因为cellForRowAtIndexPath只能获取到屏幕可见范围内的cell,一旦输入条件增加,超出屏幕之后,就获取不到这个cell。

    并且你还需要解决由于重用引起的一系列问题,没问题你也不会搜这种文章,我也是踩坑过来的,这里千万不要使用不重用cell来解决问题。

    那么正确的姿势是什么呢?

    方式一

    数据双向绑定,即MVVM。如果你的项目使用的MVVM,这种问题你肯定不会遇到。

    当然,如果你的项目不是基于MVVM的那也没有关系,因为ReactiveCocoa、
    KVO、Notification、block、delegate和target-action都可以用来做数据通信,这里我们选用最简单的block,因为block适合各种架构模式的项目,使用起来也比较简洁。

    对于非MVVM的项目,使用中也不用可以创建去创建一个VM,只需要在cell中定义一个block,在输入框内容变化时,将输入内容返回,在block回调的地方,更新数据模型即可,判断时也很方便,循环数据模型即可(可以是array、map怎么方便怎么来)

    方式二

    自定义一个view,样式就跟之前的cell一样,在创建的时候根据枚举判断使用UITextField还是UITextView

    typedef NS_ENUM(NSInteger, InputCellType){
        InputCellType_TextField  = 1,
        InputCellType_TextView   = 2
    };
    
    - (instancetype)initWithFrame:(CGRect)frame inputType:(InputCellType)inputType
    

    之后循环添加到UIScrollView:

    - (void)addContentView{
        [self.inputCellArray removeAllObjects];
        InputCellView *lastCellView;
        for (int i = 0; i < 6; i++) {
            InputCellView *cellView;
            if(i == 0){
                cellView = [[InputCellView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.width, InputCellHeight_TextField) inputType:InputCellType_TextField];
            }else if(i == 5){
                cellView = [[InputCellView alloc] initWithFrame:CGRectMake(0, lastCellView.bottom, self.scrollView.width, InputCellHeight_TextView) inputType:InputCellType_TextView];
            }
            else{
                cellView = [[InputCellView alloc] initWithFrame:CGRectMake(0, lastCellView.bottom, self.scrollView.width, InputCellHeight_TextField) inputType:InputCellType_TextField];
            }
            
            lastCellView = cellView;
            [self.scrollView addSubview:cellView];
            [self.inputCellArray addObject:cellView];
        }
            
        self.scrollView.contentSize = CGSizeMake(self.view.width, lastCellView.bottom);
    }
    

    获取数据就更方便了:

    - (NSString *)getInputCellContentWithIndex:(NSInteger)index{
        InputCellView *cellView = self.inputCellArray[index];
        if(cellView.inputType == InputCellType_TextField){
            return cellView.textField.text;
        }else{
            return cellView.textView.text;
        };
    }
    

    相关文章

      网友评论

        本文标题:iOS 如何循环遍历cell

        本文链接:https://www.haomeiwen.com/subject/utebqltx.html