如何使用Custom UITableViewCell进行搜索?将数据传递给详细视图控制器的问题

时间:2014-10-17 08:07:53

标签: ios objective-c iphone uitableview

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

我有三个问题:

1。如何设置自定义UITableViewCell的segue标识符?

由于我在xib文件中创建了自定义UITableViewCell,因此很难将xib文件与主故事板与其他视图控制器连接。

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

具体来说,为了将故事板中的默认UItableViewCell替换为我的自定义UITableViewCell,我将故事板中默认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 个答案:

答案 0 :(得分:0)

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


我已经在您的tableView:cellForRowAtIndexPath:方法中看到了问题。滚动单元格时会重复使用,因此当您执行异步调用时,块可以并且将在错误的单元格上执行。为了防止在dispatch_async回调中再次调用dequeueReusableCellWithIdentifier:
您还要将子视图直接添加到单元格,而不是使用contentView属性。

关于你的问题,据我所知你无法连接nib文件中的segue。要使其正常工作,您需要连接故事板中原型单元格中的segue。您创建了手动segue,并在用户触摸单元格时调用它。我认为,如果您根本不使用segues并且只是自己致电showViewController:sender:,那么您将更容易理解发生了什么。