ios - 从 plist 中以 segue 方式传递数据。 TableView 到详细信息 View

标签 ios objective-c tableview segue

我想将 plist 中包含的数据从 TableView 传递到详细信息 View Controller 。我用硬编码值做到了,但是当我使用 plist 时,我无法通过 segue 传递它。

这是我的 Wine.h 类:

@property (strong, nonatomic) NSString *name; //name of the wine
@property (strong, nonatomic) NSString *image; //image of the wine
@property (strong, nonatomic) NSString *information; // details for the wine

RedWinesViewController.h文件

@property (strong, nonatomic) NSMutableArray *wineList;
@property (strong, nonatomic) NSMutableArray *thumbnails;
@property (strong, nonatomic) NSMutableArray *information;

RedWinesDetailViewController.h 文件:

@property (strong, nonatomic) IBOutlet UIImageView *image;
@property (strong, nonatomic) IBOutlet UILabel *name;
@property (strong, nonatomic) IBOutlet UITextView *information;

@property (strong, nonatomic) Wine *wine;

prepareForSegue 位于 RedWinesViewController.m 文件中

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showRedWineDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        RedWinesDetailViewController *destViewController = segue.destinationViewController;
        destViewController.wine.name = [self.wineList objectAtIndex:indexPath.row];
        destViewController.wine.information = [self.information objectAtIndex:indexPath.row];
        //destViewController.wine.image = [self.thumbnails objectAtIndex:indexPath.row];
        NSLog(@"Value is %@", destViewController.wine.name);
    }
}
RedWinesDetailViewController

中的

viewDidLoad

self.title = self.wine.name;
NSLog(@"Name value is %@ - %@", self.title, self.wine.name);

此时值为空。我在这里做错了什么?

最佳答案

简短而简单的答案是您需要构造一个 Wine 对象并将其传递给您的代码以使用它。例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showRedWineDetail"]) {
      NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
      Wine *selectedWine = [Wine new];
      selectedWine.name = [self.wineList objectAtIndex:indexPath.row];
      selectedWine.information = [self.information objectAtIndex:indexPath.row];
      RedWinesDetailViewController *destViewController = segue.destinationViewController;
      destViewController.wine = selectedWine;
    }
}

但是,进一步检查您的代码后,您发现您正在使用三个数组!您可以将其合并为一个:winesList

viewWillAppear 中,您应该执行以下操作:

for (int i = 0; i < winesCount; i++)
{
  Wine *curWine = [Wine new];
  curWine.name = ;
  curWine.information = ;
  curWine.thumbnail = ;
  [self.winesList.addObject:curWine];
}

因此,您为自己构建了一系列 Wine 。你为什么要这样做?因为在您的 cellForRowAtIndexPath 中,您可以简单地执行以下操作:

{
   Wine *cellWine = [self.winesList objectAtIndex:indexPath.row];
   cell.nameLabel.text = cellWine.name;
   cell.thumbnailImageView = cellWine.thumbnail;
   cell.informationLabel.text = cellWine.information;
}

最后,在你为 segue 做准备时:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showRedWineDetail"]) {
      NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
      Wine *selectedWine = [self.winesList objectAtIndex:indexPath.row];
      RedWinesDetailViewController *destViewController = segue.destinationViewController;
      destViewController.wine = selectedWine;
    }
}

看看您如何不再需要使用三个不同的数组?您不需要确保每个都有相同的计数、相同的顺序等。创建每个 wine 对象而不是将其所有信息存储在不同的数组中,然后只存储一个 wine 数组对象。它将使您的代码更加干净、更加简洁、更加简洁、更加不易出现错误!

关于ios - 从 plist 中以 segue 方式传递数据。 TableView 到详细信息 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891973/

相关文章:

ios - 人脸检测中的人脸边界点检测

objective-c - Cocoa Touch 上不显示 UIButton 的 titleLabel.text

ios - 如何保存我的 iPhone 应用程序的用户首选项?

iphone - UIActivityIndi​​cator 没有动画

ios - [ComponentTaleView tableView :heightForFooterInSection:]: unrecognized selector sent to instance

ios - TableView 中的不同长度单元格在滚动 Swift 时使 View 对齐

iphone - 如何在iphone中实现google搜索应用

javascript - stringByEvaluatingJavaScriptFromString 在 iOS 6 中不起作用

Objective-C:以相反顺序对数组进行 block 枚举?

ios - 如何在不选择表格 View 的单元格的情况下将搜索栏作为第一响应者辞职?