UITableviewcontroller 与 UIViewController 与 didSelectRowAtIndexPath 的 tableView 方法

Posted

技术标签:

【中文标题】UITableviewcontroller 与 UIViewController 与 didSelectRowAtIndexPath 的 tableView 方法【英文标题】:UITableviewcontroller vs UIViewController with tableView method for didSelectRowAtIndexPath 【发布时间】:2014-12-12 13:50:08 【问题描述】:

我在做某事时遇到了麻烦:

我有一个 UIViewController,其中有一个 tableView,它已连接并设置了代表。我试图从 didSelectRowatIndexPath 发送一个 segue,在 prepareforSegue 中我试图读取一些选定单元格的数据(我正在使用模型来检索实际的重要数据,但我有一些元素,即我想要的 imageView从单元格中读取)

让我感到困惑的是,无论我如何设置发件人(self.tableView 或 self 或 indexPath 或任何东西),在 prepareforSegue 中我总是将单元格设置为 nil。

如果我将 UIViewController 更改为 UITableViewController 并将发送方设置为 tableView,则一切正常。

我错过了什么?

代码如下:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 


[self performSegueWithIdentifier:@"bundleItemDetails" sender:tableView];

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


if ([[segue identifier] isEqualToString:@"bundleItemDetails"])



    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];


    itemCell *cell = (itemCell*)[self.tableView cellForRowAtIndexPath:selectedIndexPath];

    NSDictionary *currentProduct = [[[productsArray objectAtIndex:selectedIndexPath.section] objectForKey:@"products"] objectAtIndex:selectedIndexPath.row];


    UINavigationController *navController = [segue  destinationViewController];
    itemDetails *bundleProducts = (itemDetails*)([navController viewControllers][0]);


    UIImage *img = cell.itemImage.image;
    bundleProducts.valueImage = img;
    bundleProducts.valueName = [currentProduct valueForKey:@"title"];
    bundleProducts.valueDescription = [currentProduct valueForKey:@"description"];
    bundleProducts.detailFullPrice.text = [currentProduct valueForKey:@"price"];


这与 UITableViewController 完美配合,并为 UIViewController 的单元格值返回 nil

更新:一些新发现

看起来 indexPathForSelectedRow 返回 null 和 0。如果我将 didSelectRowAtIndexPath 的代码更改为:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 



[self.tableView selectRowAtIndexPath:indexPath
                            animated:NO
                      scrollPosition:UITableViewScrollPositionNone];

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

[cell setSelected:YES];

[self performSegueWithIdentifier:@"bundleItemDetails" sender:self.tableView];

我得到了索引值,但我仍然有空 itemCell(itemCell 是一个带有外部 .xib 的自定义单元格,在 UIViewController 中的调用方式是否与在 UITableviewController 中不同?

【问题讨论】:

发送自我 [self performSegueWithIdentifier:@"bundleItemDetails" sender:self]; 已经试过了,结果一样,单元格为nil 所以添加 self.tableview.datasource=self 和 self.tableview.delegate=self ? 是的,两者都设置为self 告诉我你使用 NSMutableArray 来填充你的 tableView 吗? 【参考方案1】:

您可以尝试使用属性来保存要在 segue 中传递的值。您可以在didSelectRowAtIndexPath: 中设置属性,然后在prepareForSegue:sender: 中访问它们。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    self.valueImage = cell.itemImage.image;
    // etc...

    [self performSegueWithIdentifier:@"bundleItemDetails" sender:self];


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

    if ([[segue identifier] isEqualToString:@"bundleItemDetails"]) 
        UINavigationController *navController = [segue destinationViewController];
        itemDetails *bundleProducts = (itemDetails*)([navController viewControllers][0]);

        bundleProducts.valueImage = self.valueImage;
        bundleProducts.valueName = self.valueName;
        bundleProducts.valueDescription = self.valueDescription;
        bundleProducts.detailFullPrice.text = self.detailFullPrice;
    

【讨论】:

这似乎可以解决我的问题,但我仍然不明白为什么它在 UITableViewController 中不需要它【参考方案2】:

检查您的tableView tableView.allowsSelection 是否为YES

【讨论】:

我检查了它,我也尝试将其显式设置为是,没有变化

以上是关于UITableviewcontroller 与 UIViewController 与 didSelectRowAtIndexPath 的 tableView 方法的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 中的 View 属性和 TableView 属性有啥区别?

UITableViewController 在关闭第二个 ViewController 后返回到第一个单元格

我想通过在 Swift 中以编程方式将 UINavigationController 与 UITableViewController 嵌入 UITableViewController 这是 UITab

UITableviewcontroller 与 UIViewController 与 didSelectRowAtIndexPath 的 tableView 方法

Swift - UIViewController 与 UITableViewController 中的覆盖函数

尝试在 iOS 中将 UITabBarController 与 UITableViewController 一起使用时出现异常