我想将 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/