单击按钮时将表视图数据存储在数组中 - 目标 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的主要内容,如果未能解决你的问题,请参考以下文章
我想在每次单击提交按钮时将对象存储在一个数组中,但是在每个提交按钮之后它将单个对象存储在一个数组中