未在详细视图中加载数据
Posted
技术标签:
【中文标题】未在详细视图中加载数据【英文标题】:Data not loading in Detail View 【发布时间】:2010-02-27 20:18:42 【问题描述】:我正在尝试让我的数据加载到我的详细信息视图中。任何人都可以看看,看看为什么它不显示?它可以在我的 rootviewcontroller 中正常加载,而不是详细视图。
DetailViewController.m
#import "DetailViewController.h"
@implementation DetailViewController
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
- (void)setIcon:(UIImage *)newIcon
[super setIcon:newIcon];
iconView.image = newIcon;
- (void)setPublisher:(NSString *)newPublisher
[super setPublisher:newPublisher];
publisherLabel.text = newPublisher;
- (void)setName:(NSString *)newName
[super setName:newName];
nameLabel.text = newName;
- (void)dealloc
[iconView release];
[publisherLabel release];
[nameLabel release];
[priceLabel release];
[super dealloc];
@end
detailviewcontroller.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface DetailViewController : UIViewController
IBOutlet UIImageView *iconView;
IBOutlet UILabel *publisherLabel;
IBOutlet UILabel *nameLabel;
IBOutlet UILabel *priceLabel;
@end
RootViewControllerPoints.m
#import "RootViewControllerPoints.h"
#import "DetailViewController.h"
#define USE_INDIVIDUAL_SUBVIEWS_CELL 1
#define DARK_BACKGROUND [UIColor colorWithRed:151.0/255.0 green:152.0/255.0 blue:155.0/255.0 alpha:1.0]
#define LIGHT_BACKGROUND [UIColor colorWithRed:172.0/255.0 green:173.0/255.0 blue:175.0/255.0 alpha:1.0]
@implementation RootViewController
@synthesize tmpCell, data;
#pragma mark View controller methods
- (void)viewDidLoad
[super viewDidLoad];
// Configure the table view.
self.tableView.rowHeight = 73.0;
self.tableView.backgroundColor = DARK_BACKGROUND;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// Load the data.
NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
self.data = [NSArray arrayWithContentsOfFile:dataPath];
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
switch (toInterfaceOrientation)
case UIInterfaceOrientationPortrait:
case UIInterfaceOrientationLandscapeLeft:
case UIInterfaceOrientationLandscapeRight:
return YES;
default:
return NO;
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [data count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"ApplicationCell";
ApplicationCell *cell = (ApplicationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
#if USE_INDIVIDUAL_SUBVIEWS_CELL
[[NSBundle mainBundle] loadNibNamed:@"IndividualSubviewsBasedApplicationCell" owner:self options:nil];
cell = tmpCell;
self.tmpCell = nil;
#endif
// Display dark and light background in alternate rows -- see tableView:willDisplayCell:forRowAtIndexPath:.
cell.useDarkBackground = (indexPath.row % 2 == 0);
// Configure the data for the cell.
NSDictionary *dataItem = [data objectAtIndex:indexPath.row];
cell.icon = [UIImage imageNamed:[dataItem objectForKey:@"Icon"]];
cell.publisher = [dataItem objectForKey:@"Publisher"];
cell.name = [dataItem objectForKey:@"Name"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
detailViewController. = [data objectAtIndex:indexPath.row];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
@end
这一直困扰着我很长一段时间,我查看了许多示例、教程,甚至询问了其他 iPhone 开发人员。一切来源似乎都在说不同的东西。
【问题讨论】:
将 iPhone 添加为标签。到时候你会得到更多的答案。 行“detailViewController.=[data objectAtIndex:indexPath.row];”是什么在 didSelectRowAtIndexPath 应该做什么?这是您问题中的实际代码还是错字?为什么detailViewController后面有个点? 啊,这是另一位用户建议的代码行。虽然它是这样输入的,但调试器会将其作为错误来选择。如果我删除它一切加载正常,虽然数据也没有传递到子视图。 您还需要这方面的帮助吗? 是的,那太好了。 【参考方案1】:第一个问题是 DetailViewController 中的 setXXX 方法尝试调用 super setXXX,但由于 DetailViewController 是 UIViewController 的子类,因此对 super 的调用将失败,因为 UIViewController 没有此类方法。移除 setXXX 方法中对 super 的调用。
第二个问题是 setXXX 方法直接在 DetailViewController 上设置控件,但在加载视图之前无法访问控件,因此如果在调用 pushViewController 之前调用这些方法,它将无法工作。
如果您按如下方式更改 didSelectRowAtIndexPath 中的代码,它应该可以工作:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController setName:@"name here"];
[detailViewController setPublisher:@"publisher here"];
[detailViewController setIcon:yourImageVariableHere];
[detailViewController release];
虽然上述更改应该有效,但您可能需要考虑创建 ivars 来保存 DetailViewController 中的值(而不是使用 ui 控件本身来保存数据)。然后使用@property 和@synthesize 为它们创建属性。可以在 DetailViewController 创建后立即设置属性,在视图的 viewDidLoad 中,可以将 ui 控件设置为属性值。这将使 DetailViewController 能够更好地控制其 ui 的更新方式,允许您在不影响调用者的情况下更改 ui,并且不需要显示它来设置其属性。
【讨论】:
以上是关于未在详细视图中加载数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在主视图的行选择上更新详细视图的表视图或在详细视图中加载新视图?
Swift 3 tableView 未在 reloadData() 上更新