单击按钮时将表视图数据存储在数组中 - 目标 c

Posted

技术标签:

【中文标题】单击按钮时将表视图数据存储在数组中 - 目标 c【英文标题】:Store table view data in array on button click - Objective c 【发布时间】:2018-09-24 08:01:33 【问题描述】:

我有一个UITableView,每个单元格都有文本字段。我想在NSMutableArray 中获取这些文本字段中写入的文本

目前正在单击按钮时执行此操作 -

- (void)viewDidLoad 
    [super viewDidLoad];
   _optionTextArray = [[NSMutableArray alloc] init];



- (IBAction)saveClicked:(UIButton *)sender 

    editVotingOptionCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"cell"];

    for (int i=0; i<_optionArray.count; i++) 
        [_optionTextArray addObject:cell.tfOption.text];
    

但每次都存储空字符串。

【问题讨论】:

所有单元格都可见?? 你在分配_optionTextArray的内存吗,添加一些额外的代码 是的,它们都是可见的@Sh_Khan 检查我编辑的问题@Anbu.karthik 你不是已经需要把它放在一个数组中了吗? 【参考方案1】:
@interface MyCell: UITableViewCell 
    @property(strong) UITextField *textField;

假设您有一个类为MyCell 的单元格,当您点击按钮时,首先获取部分中的行数。让您有一个默认部分0,因此在此迭代循环后获取部分零的行数并在每个 indexPath 获取单元格并从该 indexPath 获取文本并检查文本是否为空,最后插入它变成一个数组。 下面是按钮点击的示例代码。

    NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0]
    NSMutableArray *allTexts = [NSMutableArray new];
    for (NSInteger i = 0; i< numberOfRows; i++) 
         NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
         MyCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        if (cell.textField.text != nil) 
            [allText addObject:cell.textField.text];
        


【讨论】:

@HappilyHemu 看看这个。 不要忘记检查应该连接的 TextField 的 IBOutlet,以便从 textField 获取数据。 这工作正常。但问题是如果我有 6 个单元格,那么只会添加 5 个值。第一个循环进入 nil 您必须检查为什么会这样,因为您身边肯定有问题导致这种情况发生。【参考方案2】:

你可以试试

(IBAction)saveClicked:(UIButton *)sender 

     for (int i=0; i<_optionArray.count; i++) 

        editVotingOptionCell *cell = [_tableView cellForRowAtIndexPath: [NSIndexPath indexPathForRow:i inSection:0]];
        if (cell != nil) 
          [_optionTextArray addObject:cell.tfOption.text];
        
        else 
          NSLog(@"nil cell")
        

    

//

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath  
   editVotingOptionCell*cell = ///
   cell.tfOption.delegate = self;
   cell.tfOption.tag = indexPath.row;
   return cell;

-(void)textFieldDidEndEditing:(UITextField *)textField 
   _optionTextArray[textField.tag] = textField.text 

//

@interface ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate>

注意:使用默认值预先初始化数组_optionTextArray

【讨论】:

导致应用程序崩溃并出现以下错误:- 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil”跨度> 这意味着cell.tfOption.text 现在是零值 只有在单元格不可见时才会发生这种情况 我猜我的所有单元格都是可见的。因为使用我的代码,应用程序不会崩溃。只是将空字符串值添加到数组中。我需要在文本字段中获取值而不是空字符串 尝试编辑,但请注意它不会计算不可见单元格,您的代码使用 dequeueReusableCellWithIdentifier 这不是这里的情况【参考方案3】:

如果所有单元格都是可见的,如你所说,你可以在这里做:

- (IBAction)saveClicked:(UIButton *)sender 
    for (int i=0; i < _tableView.visibleCells.count; i++) 
       editVotingOptionCell *cell = self.tableView.visibleCells[i];
       [_optionTextArray addObject: cell.tfOption.text];
    

更新:

此方法仅在您的所有单元格可见时才可用。

由于重用,您无法在绑定到具体单元格时获取 textField。表视图重用单元格。

因此,由于表格视图策略,您可以在下面看到的关于 cellForRowAtIndexPath:indexPath 的建议并不是一个好主意。

如果您想从单元格中获取所有文本,您应该将其保存在数组中的其他位置,而不是表格视图单元格中。例如,您可以在文本字段更新后在 UITextFieldDelegate 方法中保存文本字段中的文本。

【讨论】:

此代码给出以下错误 - 在“__kindof UITableViewCell *”类型的对象上找不到属性“tfOption” 已更新,请立即尝试 这不会计算所有单元格 如果所有单元格都是可见的 - 是一样的,否则会因为tableview中的单元格重用而出现一些问题 那么如何计算所有单元格呢? @AntonRodzik【参考方案4】:

我认为最好从 tableView 的 dataSource 数组而不是从单元格中获取数据。

所以每次textField的文本改变你应该存储它的值,我已经为你写了一个演示:

这是 MyCell.h 代码:

#import <UIKit/UIKit.h>

typedef void(^TextFieldValueChangedBlock)(NSString *text);

@interface MyCell : UITableViewCell

@property (nonatomic, copy) TextFieldValueChangedBlock textFieldValueChangedBlock;

@property (nonatomic, copy) NSString *textFieldValue;

@end

这是 MyCell.m 代码:

#import "MyCell.h"

@interface MyCell ()

@property (nonatomic, strong) UITextField *myTextField;

@end

@implementation MyCell 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) 
        self.myTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
        [self.contentView addSubview:self.myTextField];
        [self.myTextField addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged];
    
    return self;


- (void)textFieldChanged:(UITextField *)textField 
    if (self.textFieldValueChangedBlock) 
        self.textFieldValueChangedBlock(textField.text);
    


- (void)setTextFieldValue:(NSString *)textFieldValue 
    self.myTextField.text = textFieldValue;


@end

最后这是 ViewController.m 代码:

#import "ViewController.h"
#import "MyCell.h"

@interface ViewController () <UITableViewDataSource>

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataArray;

@property (nonatomic, strong) NSMutableArray *stringArray;

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.dataArray = [NSMutableArray array];
    for (int i = 0; i < 100; i++) 
        [self.dataArray addObject:@"text"];
    

    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.tableView];
    self.tableView.dataSource = self;


- (void)saveClicked:(UIButton *)sender 
    self.stringArray = self.dataArray.mutableCopy;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return self.dataArray.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *cellReuseID = @"cell";
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellReuseID];
    if (!cell) 
        cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellReuseID];
    
    cell.textFieldValue = self.dataArray[indexPath.row];
    // textField value change,store value
    __weak typeof(self) weakSelf= self;
    cell.textFieldValueChangedBlock = ^(NSString *text) 
        __strong typeof(self) strongSelf = weakSelf;
        [strongSelf.dataArray replaceObjectAtIndex:indexPath.row withObject:text];
    ;
    return cell;


@end

【讨论】:

以上是关于单击按钮时将表视图数据存储在数组中 - 目标 c的主要内容,如果未能解决你的问题,请参考以下文章

在数据表中单击按钮时将表列更改为jquery日历

我想在每次单击提交按钮时将对象存储在一个数组中,但是在每个提交按钮之后它将单个对象存储在一个数组中

在 android 中单击按钮时将列表视图中的选中项目转移到另一个列表视图

在 Swift iOS 中单击按钮时将视图移动到另一个视图

如何在按钮单击时将部分视图呈现为模式弹出窗口?

单击按钮时将单元格动态添加到 UItableview