如何从另一个视图控制器将值插入 UITableViewCell
Posted
技术标签:
【中文标题】如何从另一个视图控制器将值插入 UITableViewCell【英文标题】:How to insert values into a UITableViewCell from another view controller 【发布时间】:2014-12-16 04:35:37 【问题描述】:我有一个UITableView
,里面有 10 个单元格。我在所有 10 个单元格中都有一个 UIButton
和 UILabel
。现在,如果我在第二个单元格中选择 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
的数据源 array
和 selectedRow
属性包含在 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的主要内容,如果未能解决你的问题,请参考以下文章
如果您从一个视图控制器快速移动到另一个视图控制器,如何动态地将值添加到数组中?