我使用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;
}
}
}
答案 0 :(得分:0)
您是否尝试调试方法并查看发件人的值?您在indexPath
的来电中提供了performSegueWithIdentifier:sender:
,但您使用发件人作为indexPathForCell:
中的单元格。
我已经在您的tableView:cellForRowAtIndexPath:
方法中看到了问题。滚动单元格时会重复使用,因此当您执行异步调用时,块可以并且将在错误的单元格上执行。为了防止在dispatch_async回调中再次调用dequeueReusableCellWithIdentifier:
。
您还要将子视图直接添加到单元格,而不是使用contentView
属性。
关于你的问题,据我所知你无法连接nib文件中的segue。要使其正常工作,您需要连接故事板中原型单元格中的segue。您创建了手动segue,并在用户触摸单元格时调用它。我认为,如果您根本不使用segues并且只是自己致电showViewController:sender:
,那么您将更容易理解发生了什么。