如何从另一个视图控制器将值插入 UITableViewCell

Posted

技术标签:

【中文标题】如何从另一个视图控制器将值插入 UITableViewCell【英文标题】:How to insert values into a UITableViewCell from another view controller 【发布时间】:2014-12-16 04:35:37 【问题描述】:

我有一个UITableView,里面有 10 个单元格。我在所有 10 个单元格中都有一个 UIButtonUILabel。现在,如果我在第二个单元格中选择 UIButton,我将导航到另一个页面并选择一些值(字符串值)。现在,我希望将该字符串放在第二个单元格的 UILabel 中。同样,如果我在第 5 个单元格上选择 UIButton,我将导航到另一个页面,选择一些字符串,并且该字符串必须放在第 5 个单元格的 UILabel 中。如何在该特定单元格的 UILabel 内插入值。

想法受到赞赏。

【问题讨论】:

使用委托方法。 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 创建NSIndexPath 的属性并在didSeclectRow: 方法中为其设置值。在下一个视图控制器中选择值后,您可以将该值添加到数据源并重新加载选定的行。 你想使用数据库还是简单地使用数组和字符串.. @Balaji:仅使用数组。 @Vignesh 可以显示cellForRow 代码吗? 【参考方案1】:

我建议将第二个视图控制器设置为包含第一个视图控制器的实例,这样您就可以从第二个视图操作第一个视图控制器的数据数组。

例如,在 FirstViewController 的部分中,您创建 SecondViewController 以执行推送(因为正如您在 cmets 中所说,您正在使用 UINavigationController 推送视图控制器),也使SecondViewController 包含 FirstViewController 的一个实例。

FirstViewController.m:

// Method to handle the push transition
- (void)buttonPressed:(UIButton*)button 

    // Set the view controller's `selectedRow` property
    // to contain the selected row number as contained in 
    // the button tag in this particular scenario
    self.selectedRow = (int)button.tag;

    // Create an instance of SecondViewController
    SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

    // Pass the view controller along by setting
    // the secondViewController's firstViewController
    // property to contain self, i.e. the current
    // instance of the FirstViewController
    secondViewController.firstViewController = self;

    // Push to the SecondViewController
    [self.navigationController pushViewController:secondViewController animated:YES];

SecondViewController 的.h 中,添加firstViewController 属性,以便可以从FirstViewController 公开访问。

SecondViewController.h:

#import "FirstViewController.h"

@interface SecondViewController : UIViewController

@property (weak, nonatomic) FirstViewController *firstViewController;

然后在SecondViewController 的.m 中,您可以根据需要在弹出视图之前操作作为FirstViewController 中表数据源的数组。

SecondViewController.m:

// Method called after the string is selected
- (void)stringSelected:(NSString*)string 

    // Update the array to contain the string
    // (or do whatever manipulation to whatever data
    // structure is fitting in your particular case)
    [self.firstViewController.array replaceObjectAtIndex:self.firstViewController.selectedRow withObject:string];

    // To go back to the previous view, pop the view controller
    [self.navigationController popViewControllerAnimated:YES];

此外,您还希望 UITableView 的数据源 arrayselectedRow 属性包含在 FirstViewController 的 .h 中,以便可以从 SecondViewController 公开访问。

FirstViewController.h:

@property (weak, nonatomic) NSMutableArray *array;
@property (nonatomic) int selectedRow;

FirstViewController 的.m 中,您要确保在从另一个视图返回时重新加载表数据,以便UITableView 反映更新的数据。

FirstViewController.m:

- (void)viewWillAppear:(BOOL)animated 
    [self.table reloadData];

【讨论】:

@Balaji 谢谢...我认为解释如何在一个地方使用 UINavigationController 时传递数据会很有帮助。 你能帮我解决这个问题吗:***.com/questions/27668375/…【参考方案2】:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellName" forIndexPath:indexPath];
if(cell == nil)

    cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellName"];


//Assigning the contents of cell
cell.labelName.text = [NSString stringWithFormat:@"%@", [self.arrCategoryTitle objectAtIndex:indexPath.row]];

[cell.buttonName addTarget:self action:@selector(buttonNamePressed:) forControlEvents:UIControlEventTouchDown];

// Configure the cell...

return cell;


- (void)buttonNamePressed:(UIButton *)sender

CGPoint swipepoint = sender.center;
CGPoint rootViewPoint = [sender.superview convertPoint:swipepoint toView:self.tableName];
NSIndexPath *indexPath = [self.tableName indexPathForRowAtPoint:rootViewPoint];
NSLog(@"%@", indexPath);

[self.tableName cellForRowAtIndexPath:indexPath];
self.defaultRowId = indexPath.row;
[self performSegueWithIdentifier:@"viewControllerIdentifierName" sender:self];



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


        DetailsViewController *detailsViewController = (DetailsViewController *)[(UINavigationController *)segue.destinationViewController topViewController];
        detailsViewController.defaultrow = self.defaultRowId;


现在,当您导航到 secondViewController 时,将选择字符串值设置为 firstViewController 的属性,然后重新加载表。

【讨论】:

这里defaultRowId的数据类型是什么? @Vignesh: NSInteger 或 int 随便 @Vignesh:你为什么不把 +1 和回答正确。 @Vignesh:如果您将此标记为正确,那么其他人也可以轻松找到答案 @Balaji 这里的主要问题是 OP 使用的是 UINavigationController 而不是故事板(我在他的问题下面的 cmets 中问过),因此不会调用 prepareForSegue 方法。您的代码也可以将数据向前传递,但 OP 希望将数据从“DetailsViewController”向后传递到 tableview。

以上是关于如何从另一个视图控制器将值插入 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

如何将值传递给另一个视图控制器?

使用标签栏从另一个视图返回时如何重新加载视图控制器

如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?

选中复选框时,数据表视图将值插入到字段中

如何通过iOS Objective C中的appDelegate从另一个视图控制器重新加载表视图

如何在使用 UIpageviewcontroller 导航页面时从另一个视图控制器自动更新视图控制器上的标签