我有一个plist(字典数组),它填充表视图并正常工作。我使用Xcode 4和故事板。
现在我已经从常规UIViewController创建了一个详细视图,当然我希望所选名称在详细视图中的nameLabel中显示。但我无法建立正确的联系。到目前为止,这是我的代码:
WineObject.m:
#import "WineObject.h"
@implementation WineObject
@synthesize libraryContent, libraryPlist;
- (id)initWithLibraryName:(NSString *)libraryName {
if (self = [super init]) {
libraryPlist = libraryName;
libraryContent = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:libraryPlist ofType:@"plist"]];
}
return self;
}
- (NSDictionary *)libraryItemAtIndex:(int)index {
return (libraryContent != nil && [libraryContent count] > 0 && index < [libraryContent count])
? [libraryContent objectAtIndex:index]
: nil;
}
- (int)libraryCount {
return (libraryContent != nil) ? [libraryContent count] : 0;
}
- (void) dealloc {
if (libraryContent) [libraryContent release];
[super dealloc];
}
@end
ViewController.h:
#import <UIKit/UIKit.h>
@class WineObject;
@interface WinesViewController : UITableViewController {
WineObject *wine;
}
@end
ViewController.m:
#import "WinesViewController.h"
#import "WineObject.h"
#import "WineCell.h"
@interface WinesViewController ()
@end
@implementation WinesViewController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
#pragma mark - Table view data source
- (void)viewWillAppear:(BOOL)animated {
wine = [[WineObject alloc] initWithLibraryName:@"Wine"];
self.title = @"Vinene";
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [wine libraryCount];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"wineCell";
WineCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
cell.nameLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Name"];
cell.districtLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"District"];
cell.countryLabel.text = [[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Country"];
cell.bottleImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Image"]];
cell.flagImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Flag"]];
cell.fyldeImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Fylde"]];
cell.friskhetImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Friskhet"]];
cell.garvesyreImageView.image = [UIImage imageNamed:[[wine libraryItemAtIndex:indexPath.row] valueForKey:@"Garvesyre"]];
return cell;
}
#pragma mark - Table view delegate
@end
WineCell.h:
#import <UIKit/UIKit.h>
@interface WineCell : UITableViewCell
@property (nonatomic, strong) IBOutlet UILabel *nameLabel;
@property (nonatomic, strong) IBOutlet UILabel *districtLabel;
@property (nonatomic, strong) IBOutlet UILabel *countryLabel;
@property (nonatomic, strong) IBOutlet UIImageView *bottleImageView;
@property (nonatomic, strong) IBOutlet UIImageView *flagImageView;
@property (nonatomic, strong) IBOutlet UIImageView *fyldeImageView;
@property (nonatomic, strong) IBOutlet UIImageView *friskhetImageView;
@property (nonatomic, strong) IBOutlet UIImageView *garvesyreImageView;
@end
答案 0 :(得分:1)
您是使用XIB进行界面还是以编程方式生成界面?
如果您使用的是XIB,则问题是您没有加载它:
更改
winesDetailViewController = [[WinesDetailViewController alloc] init];
要
winesDetailViewController = [[WinesDetailViewController alloc] initWithNibName:@"YourNibNameHere" bundle:nil];
或者,如果以编程方式生成它,则必须先设置nameLabel,否则它将为nil。 @synthesize不设置变量,它只是生成getter和setter,以便您可以从外部设置它。
在viewDidAppear:
内(或更好地在init
内)添加:
self.nameLabel=[[UILabel alloc] initWithFrame:CGRectMake(100,100,100,100)];
编辑:如果您使用的是Storyboard,则表明您必须执行以下操作。
故事板是关于人际关系的。在故事板编辑器中,您可以添加按钮并告诉他们连接到哪个视图控制器。同样的想法适用于TableView Cells。您可以添加原型表视图单元格(并对其进行自定义)并为其指定关系。您希望提供的关系是您的详细信息视图。
1。)子类UITableViewCell并为其提供一个属性,该属性是您尝试发送到详细视图的字典
2.。)创建单元格(cellForRowAtIndexPath:
)时,您需要确保将自定义单元格出列并将字典分配给您提供的属性。
3.确保您的详细信息视图具有标识符:DetailView
4.。)在表视图控制器中,添加以下代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"DetailView"])
{
//This works because by the time prepareForSeque: is called, the navigationController has loaded the new view
((DetailView *)[[self.navigationController viewControllers] objectAtIndex:0]).dataProperty=((MyCustomTableViewCell *)sender).dataProperty;
}
}
应该这样做!