如何使用自定义 UITableViewCell 进行 Segue?将数据传递到详细视图控制器的问题

Posted

技术标签:

【中文标题】如何使用自定义 UITableViewCell 进行 Segue?将数据传递到详细视图控制器的问题【英文标题】:How to Segue using Custom UITableViewCell? Problems with passing data to the detail view controller 【发布时间】:2014-10-17 08:07:52 【问题描述】:

我使用 nib 文件创建了一个自定义 UITableViewCell。然后当我选择我的自定义 UITableViewCell 时,我想执行 segue 并将数据传递给详细视图控制器。我已经在storyboard中设置了segue标识符,我把prepareForSegueWithIdentifier放在了- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中,但是当我执行segue的时候,详细页面上只能显示表格视图的第一行。

我有三个问题:

1.如何为自定义 UITableViewCell 设置 segue 标识符?

由于我在 xib 文件中创建了自定义 UITableViewCell,因此很难将 xib 文件与主情节提要与其他视图控制器连接起来。

2。如果我在故事板中更改表格视图单元格的类名,它会是我的自定义 UITableViewCell 吗?

具体来说,为了将storyboard中默认的UItableViewCell替换为我的自定义UITableViewCell,我将storyboard中默认UITableViewCell的类名改为我自定义的UITableViewCell。然后我 Control + Drag 创建一个 push segue 并设置 segue 标识符。不过这个好像也行不通。

3.为什么每次我执行segue,目标视图控制器只显示我的表格视图第一行的具体内容?

也就是说,每当我选择第一个单元格、第二个单元格、第三个单元格......时,我在 segue 到目标视图控制器后得到的只是第一个单元格的内容。我想知道发件人是否是我的自定义 UITableViewCell?还是 indexPath 为零?我不确定。

我的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    customTableViewCell *cell;
    cell = (customTableViewCell *) [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (!cell) 
        NSArray *nib = [[NSBundle mainBundle]loadNibNamed:@"customTableViewCell" owner:nil options:nil];
        cell = [nib objectAtIndex:0];
    

    NSDictionary *photo = self.recentPhotos [indexPath.row];


    dispatch_queue_t queue = dispatch_queue_create("fetch photos", 0);
    dispatch_async(queue, ^

        NSURL *imageURL = [FlickrFetcher URLforPhoto:photo format:FlickrPhotoFormatSquare];
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageURL]];

        dispatch_async(dispatch_get_main_queue(), ^

            NSString *title = [photo valueForKeyPath:FLICKR_PHOTO_TITLE];

            cell.cellLabel.text = title;



            UIImageView *cellImageView = [[UIImageView alloc]initWithImage:image];
            [cellImageView setFrame: CGRectMake(10, 5, 45, 45)];
            [cellImageView.layer setCornerRadius:cellImageView.frame.size.width/2];
            cellImageView.clipsToBounds = YES;

            [cell addSubview:cellImageView];

        );
    );

      return cell;


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

    [self performSegueWithIdentifier:@"go" sender:indexPath];


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


        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        NSDictionary *photo = self.recentPhotos [indexPath.row];
        NSURL *imageURL = [FlickrFetcher URLforPhoto:photo format:FlickrPhotoFormatLarge];
        NSString *title = [photo valueForKeyPath:FLICKR_PHOTO_TITLE];

        if ([segue.identifier isEqualToString:@"go"]) 
            if ([segue.destinationViewController isKindOfClass:[ViewImageViewController class]]) 
                ViewImageViewController *vivc = (ViewImageViewController *) segue.destinationViewController;
                vivc.imageURL = imageURL;
                vivc.title = title;
            
        


【问题讨论】:

【参考方案1】:

您是否尝试过调试该方法并查看 sender 的值?您在对performSegueWithIdentifier:sender: 的调用中提供了indexPath,但您将发件人用作indexPathForCell: 中的单元格。

我已经在您的 tableView:cellForRowAtIndexPath: 方法中看到了问题。滚动单元格时会重复使用,因此当您执行异步调用时,该块可以并且将在错误的单元格上执行。为了防止在 dispatch_async 回调中再次调用dequeueReusableCellWithIdentifier:。 另外,您正在将子视图直接添加到单元格中,而不是使用 contentView 属性。 关于您的问题,据我所知,您无法从 nib 文件连接 segue。为了使其正常工作,您需要连接故事板中原型单元的转场。您创建了一个手动 segue,并在用户触摸单元格时调用它。我认为,如果您根本不使用 segue 并自己致电 showViewController:sender:,您会更容易理解正在发生的事情。

【讨论】:

非常感谢!我尝试调试发件人的值。每当我选择单元格时,控制台都会显示如下“2014-10-24 16:32:53.161 Flickr Photo App[1484:70177] length = 2, path = 0 - 3 2014-10 -24 16:32:56.744 Flickr 照片应用 [1484:70177] 长度 = 2,路径 = 0 - 1”。此外,我尝试调试 indexPath 的值,它总是“0” 发件人是IndexPath。您在调用 segue 时将其发送。在其上打印行属性,您应该会看到正确的值

以上是关于如何使用自定义 UITableViewCell 进行 Segue?将数据传递到详细视图控制器的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?

如何使用 xib 文件自动布局宽度自定义 UITableViewCell

如何使用 Interface Builder 中的自定义 UITableViewCell?

如何使用 cellForRowAtIndexPath 从 TableView 中获取自定义 UITableViewCell?

如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?

如何使用自定义 UITableViewCell 进行 Segue?将数据传递到详细视图控制器的问题