如何从目标c中的uitableViewCell取回文本字段数据?

Posted

技术标签:

【中文标题】如何从目标c中的uitableViewCell取回文本字段数据?【英文标题】:How to get back textfield data from tableViewCell in objective c? 【发布时间】:2017-02-23 10:48:00 【问题描述】:

我有两个tableViewControllers,第二个tableViewController tableViewCell 有textFieldimageView,当我单击navigationBarBackButton 时,如何从textfield 获取数据(我想将该数据存储在第一个tableViewController )。

// code from second tableViewController...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

   if (indexPath.row == 0) 
      UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellID"];

      cell.textLabel.text = @"SIM Name";
      cell.detailTextLabel.text = @"AirTel";
      cell.imageView.image = [UIImage imageNamed:@"Star2.png"];

     return cell;
   

   TableViewCell1 *cell1 = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
   cell1.nameTextField.delegate = self;


   if (indexPath.row == 1) 

      NSArray *cell1XibRef = [[NSBundle mainBundle]loadNibNamed:@"TableViewCell1" owner:self options:nil];
      cell1 = [cell1XibRef objectAtIndex:0];
      cell1.imageView.image = [UIImage imageNamed:@"Con.png"];
      self.nameString = cell1.nameTextField.text;

      return cell1;
   

  return nil;


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

return YES;


- (void)textFieldDidBeginEditing:(UITextField *)textField
  //Whenever people start editing your textfield

    self.nameString = textField.text;
    NSLog(@"%@", self.nameString);

 

【问题讨论】:

使用委托模式。 您可以使用委托方法,也可以简单地使用 NSUserdefaults。 您可以使用NSNotificationCenter 并创建一个事件来发回您想要的值。 当我点击后退按钮时,它没有从文本字段中获取数据...... self.nameString = cell1.nameTextField.text; 【参考方案1】:

有很多方法可以做到这一点,但我更喜欢这种方式

像这样将textfield.text 的值保存在NSUserDefaults

  [[NSUserDefaults standardUserDefaults] setObject:textField.text forKey:@"controllerTwo"];

并在第一个控制器中获取该值

NSString *secondContrllerText = [[NSUserDefaults standardUserDefaults] stringForKey:@"controllerTwo"];

【讨论】:

好的,在设置数据之前,首先需要从文本字段中获取数据。但它没有从文本字段中获取数据,为什么? 一旦数据来自文本字段,我们只能将该数据分配给字符串或 naUserDefaults..... 当您点击 navigationBarback 按钮时,尝试获取文本字段文本并分配给 userdefaults 尝试将标签设置为文本字段并根据该标签获取数据 self.nameString = cell1.nameTextField.text; NSLog(@"%@", self.nameString);我写了这两行,但它打印任何东西......【参考方案2】:

您可以直接在一个数组中添加单元格并从该数组中加载单元格,这将返回包含所有编辑的最新单元格。

NSMutableArray *arrCells = [[NSMutableArray alloc] init];
for (init i=0; i<20; i++)
    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellID"];
    arrCells = cell;

在 cellForRowAtIndexPath 方法中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     UITableViewCell *cell = arrCell[indexPath.row];
     ......
     return cell;


【讨论】:

您可以从这里取回您的数据。将 Textfield 标记设置为 indexPath.row 值。从那里你可以回来。【参考方案3】:

这是我喜欢用块传递数据的代码。这是希望帮助你的代码。

FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

@end

FirstViewController.m

#import "FirstViewController.h"
#import "ViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.



 - (void)buttonClick
 
     ViewController *controller = [[ViewController alloc] init];
     controller.passTheTextFieldData = ^(NSString *textValue)
         NSLog(@"show the  %@ textValue",textValue);
     ;
[self.navigationController pushViewController:controller animated:YES];
 

@end

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic, strong) void (^passTheTextFieldData)();

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()<UITextFieldDelegate>

@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) NSString  *textValue;

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.textField addTarget:self action:@selector(textFieldValueChanged) forControlEvents:UIControlEventValueChanged];



- (void)textFieldValueChanged

    self.textValue = self.textField.text;


- (void)navigationbarBackClick

    if (self.passTheTextFieldData) 
        self.passTheTextFieldData(self.textValue);
    

@end

【讨论】:

也一样!我只是向您展示解决方案,如果您每个 tableViewCell 都有一个文本字段。正确的做法是创建一个模型或 NsMutableArray 来存储所有数据,然后将数据通过块传递给 firstViewContoller。【参考方案4】:

设置tableViewCell中textField的tag属性

然后循环遍历单元格

for (int i = 0 ; i

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    UITextField *txtfield = [[cell contentView]viewWithTag:2];

    //now get the text txtfield.text

希望对你有帮助

【讨论】:

【参考方案5】:

您可以使用delegate 方法来存储您的值或使用NSUserdefaults。但是您必须存储一个值才能将其传递给另一个表视图,我建议您使用NSUserdefaults

//假设你必须保存文本(获取你的数据)

NSString *valueToSave = cell1.nameTextField.text;
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"keyAbcd"];
[[NSUserDefaults standardUserDefaults] synchronize];

//要显示数据的另一个页面(粘贴数据)

NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"keyAbcd"];//your key have to be same
//print save value in nslog

【讨论】:

如果我们想先将数据存储在 NSUserDefaults 中,我们需要获取数据……但它不会来…… 是的,您必须先获取数据才能将数据存储在 NSUserdefaults 中。如果您没有获得数据,那么您将无法在默认值中存储数据。 存储数据 NSString *valueToSave = cell1.nameTextField.text; [[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"keyabcd"]; [[NSUserDefaults standardUserDefaults] 同步]; NSString *savedValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"keyabcd"]; //打印保存的值

以上是关于如何从目标c中的uitableViewCell取回文本字段数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableViewCell 中垂直居中对齐 UIButton? (目标 C)

如何从 C# 中的二维对象数组中取回大小?

如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?

Android 联系人照片:如何从网络上取回 (Google) 联系人图片(因此,“取消”以前的本地图片更改)

如何从 scipy 稀疏块矩阵中取回块?

如何在目标 c 中模拟类方法以与 TDD 一起使用