访问 didSelectRowAtIndexPath 内部的数据源并将数据传递给视图控制器
Posted
技术标签:
【中文标题】访问 didSelectRowAtIndexPath 内部的数据源并将数据传递给视图控制器【英文标题】:Access data source inside didSelectRowAtIndexPath and pass data to view controller 【发布时间】:2014-07-11 17:56:54 【问题描述】:我的自定义表格视图单元格的代码如下所示。我在每个自定义单元格中有 5 个标签,它们可以通过它们的标签而不是它们的标签来区分。 (每个标签都有不同的标签)。不使用标签 ID。因此,如果我要通过下面显示的方法从单元格中的标签中提取 NSString,我如何知道正在拉哪个字符串? 我不确定这段代码是否可以工作
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NoViewController *noViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NoViewController"];
NSString *label1 = [_nodes objectAtIndex:indexPath.row];
NSString *label2 = [_nodes objectAtIndex:2];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Node *node = [self.nodes objectAtIndex:indexPath.row];
static NSString *CellIdentifier = @"NodeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
CellIdentifier forIndexPath:indexPath];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = node.nodeid;
label = (UILabel *)[cell viewWithTag:2];
label.text = [NSString stringWithFormat:@" %.0f"];
label = (UILabel *)[cell viewWithTag:3];
label.text = [NSString stringWithFormat:@" %.0f"];
label = (UILabel *)[cell viewWithTag:4];
label.text = [NSString stringWithFormat:@" %.0f"];
label = (UILabel *)[cell viewWithTag:5];
label.text = [NSString stringWithFormat:@" %.0f"];
label = (UILabel *)[cell viewWithTag:6];
label.text = [NSString stringWithFormat:@" %.0f"];
label = (UILabel *)[cell viewWithTag:7];
label.text = [NSString stringWithFormat:@" %.0f"];
return cell;
AppDelegate.m
RKManagedObjectMapping *nodeMapping = [RKManagedObjectMapping mappingForClass:[Node class] inManagedObjectStore:objectStore];
【问题讨论】:
你的问题很不清楚。您发布的代码没有从任何单元格的任何标签中获取文本。_nodes
是什么(除了数组)?
我认为这就是我的问题所在。 _nodes 是一个包含 6 个对象的数组,每个对象包含 5 个字符串。我对如何从自定义单元格中提取字符串的值感到困惑
如何在cellForRowAtIndexPath
方法中设置每个单元格?您从_nodes
获得数据,对吗?在didSelectRowAtIndexPath
中做同样的事情。无需访问单元格或标签。只需从节点中获取字符串,就像设置单元格一样。
单元格中的每个标签都被来自服务器的数据填充。这就是为什么我需要在填满单元格标签后访问它们。单击后,我需要将这些字符串从选定的表格单元格传递到 detailviewcontroller。
@AkhilYeleswarapu 您想将所选节点传递给详细视图是您想要实现的目标吗?
【参考方案1】:
虽然您当前的代码并不清楚它打算实现什么,但您似乎正在尝试提取一些标签字符串,并将其传递给另一个视图控制器。
以下是所涉及步骤的高级概述:
1 - 您必须首先获得对您点击的单元格的引用。通常,致电cellForRowAtIndexPath
应该会有所帮助。
MyTableViewCell * cell = [myTableView cellForRowAtIndexPath:indexPath];
2 - 从单元格中获取标签引用:
UILabel * label = [cell viewWithTag:TAG_ASSIGNED]; //TAG_ASSIGNED should be assigned under cellForRowAtIndexPath earlier.
请注意,如果您的单元格有自定义类,并且为 UILabel 分配了出口,还有其他方法可以从单元格中获取标签 - 这是非常常见的设计,但超出了此处的答案范围。
3 - 获取标签的文本:
NSString * text = label.text;
4 - 实例化视图控制器 - 只执行一次,而不是每次点击。要维护参考,请为其分配一个 iVar。
在.h文件中:
NoViewController * noViewController;
在 .m 文件中,didSelectRowAtIndexPath
下:
if (!noViewController)
noViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NoViewController"];
总而言之,您的 didSelectRowForIndexPath 应该如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
MyTableViewCell * cell = [myTableView cellForRowAtIndexPath:indexPath];
UILabel * label = [cell viewWithTag:TAG_ASSIGNED]; //TAG_ASSIGNED should be assigned under cellForRowAtIndexPath earlier.
NSString * text = label.text;
if (!noViewController)
noViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NoViewController"];
//Do whatever now..
只要是你想要的,就应该这样做!
【讨论】:
编辑了问题标题(一开始就应该做的事情)以反映“应该做的事情”——希望新人能够意识到投票背后的原因。【参考方案2】:你需要做的就是执行一个segue,然后在prepareForSegue
中分配选定的节点:
didSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self performSegueWithIdentifier:@"detailSegue" sender:self];
prepareForSegue
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([segue.identifier isEqualToString:@"detailSegue"])
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NoViewController *noViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NoViewController"];
noViewController.selectedNode = [_nodes objectAtIndex:indexPath.row];
DetailViewController.h
#import "Node.h"
@interface DetailViewController : UIViewController
@property (nonatomic, strong) Node *selectedNode;//or whatever type
@end
DetailViewController.m
-(void)viewDidLoad
mylabel1.text = _selectedNode.lastdelivered1;
mylabel2.text = _selectedNode.lastdelivered2;
//and so forth
【讨论】:
通过这样做,我如何访问每个单元格中的标签? @AkhilYeleswarapu 你不访问你访问数据源的标签,这就是 MVC 的重点,将此行放在 prepareForSegueNode *node = [self.nodes objectAtIndex:indexPath.row];
中并访问它
好的,我在 noViewController.selectedNode 上遇到错误,你能告诉我这个问题是从哪里来的吗?另外,在 detailViewController 中收到数据源后,如何访问字符串?
@AkhilYeleswarapu 我扩展了我的答案
@AkhilYeleswarapu 我更新了它,你可能需要稍微调整一下以上是关于访问 didSelectRowAtIndexPath 内部的数据源并将数据传递给视图控制器的主要内容,如果未能解决你的问题,请参考以下文章