访问 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 的重点,将此行放在 prepareForSegue Node *node = [self.nodes objectAtIndex:indexPath.row]; 中并访问它 好的,我在 noViewController.selectedNode 上遇到错误,你能告诉我这个问题是从哪里来的吗?另外,在 detailViewController 中收到数据源后,如何访问字符串? @AkhilYeleswarapu 我扩展了我的答案 @AkhilYeleswarapu 我更新了它,你可能需要稍微调整一下

以上是关于访问 didSelectRowAtIndexPath 内部的数据源并将数据传递给视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

访问性模式

如何设置MSSQL数据库访问用户及访问权限

在SQL数据访问中如何对不同级别设置访问权限

有效访问时间和平均访问时间

一个网站用域名可以访问,用ip不能访问,是为啥?

C盘 位置不可用,无法访问C:\ 拒绝访问