我有一个名为Product的类包含一些属性,我想让我的类成为名为Products的Product列表的基础。此列表可以在UITableView中访问,以填充产品的内容。
此外,每个产品的内容将由网络服务填写。
我的代码是:
@interface Product : NSObject
{
int identifier;
NSString* title;
NSString* quantity;
float price;
UIImage* image;
}
@property (nonatomic, assign) int identifier;
@property (nonatomic, retain) NSString* title;
@property (nonatomic, retain) NSString* quantity;
@property (nonatomic, assign) float price;
@property (nonatomic, retain) UIImage *image;
-(id)initWithProduct:(int) identifier withTitle:(NSString*)title numberUses:(NSString*)uses withPrice:(float)price withImage:(UIImage*)image;
@end
用他的.m
@implementation Product
@synthesize identifier = _identifier;
@synthesize title = _title;
@synthesize price = _price;
@synthesize quantity = _quantity;
@synthesize image = _image;
- (void)dealloc {
NSLog(@"article dealloc \n");
[self.title release];
[self.quantity release];
[self.image release];
[super dealloc];
}
- (id)init {
self = [super init];
if(self) {
self.title = [[[NSMutableString alloc] init] autorelease];
self.identifier = 0;
self.price = 45.0;
self.quantity = [[[NSMutableString alloc] init] autorelease];
self.image = [[[UIImage alloc] init] autorelease];
}
return self;
}
-(id)initWithProduct:(int) inIdentifier withTitle:(NSString*)inTitle numberUses:(NSString*)inQuantity withPrice:(float)inPrice withImage:(UIImage*)inImage
{
self = [super init];
if (self) {
if (title!= nil) {
self.title = inTitle;
}
if (quantity!= nil) {
self.quantity = inTitle;
}
if (image!= nil) {
self.title = inTitle;
}
self.price = inPrice;
self.identifier = inIdentifier;
}
return self;
}
@end
我的UITableView标题是:
@interface TableView : UIViewController
< UITableViewDataSource
, UITableViewDelegate
>{
NSMutableArray *products;
}
在m。我有:
修改 现在我的单元格的标题显示为(null)
- (void)viewDidLoad
{
[super viewDidLoad];
products = [[NSMutableArray alloc] init];
[products addObject:[[Product alloc] initWithProduct:1 withTitle:@"df" numberUses:@"dsf" withPrice:12.3 withImage:[UIImage imageNamed:@"btn_invite"]]];
[products addObject:[[Product alloc] initWithProduct:1 withTitle:@"2" numberUses:@"dsf" withPrice:12.3 withImage:[UIImage imageNamed:@"btn_invite"]]];
[products addObject:[[Product alloc] initWithProduct:1 withTitle:@"4" numberUses:@"dsf" withPrice:12.3 withImage:[UIImage imageNamed:@"btn_invite"]]];
[products addObject:[[Product alloc] initWithProduct:1 withTitle:@"4" numberUses:@"dsf" withPrice:12.3 withImage:[UIImage imageNamed:@"btn_invite"]]];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Controller *cell = (Controller*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSString* nameNib = UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM() ? @"Controller" : @"ControllerIph";
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nameNib owner:self options:nil];
cell = [nib objectAtIndex:0];
}
Product* obj = [products objectAtIndex:indexPath.row];
cell.title.text = [NSString stringWithFormat:@"%@", obj.title];
return cell;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 4;
}
提前致谢!
答案 0 :(得分:2)
在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中,您没有为TableView初始化单元格。在您已有的代码之前将以下代码添加到此方法
static NSString *CellIdentifier = @"Cell Identifier";
UITableViewCell *cell;
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
并确保在该方法结束时return cell;
还要确保实现其余必要的TableView委托方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
答案 1 :(得分:2)
不是您的问题的答案,而是关于您的代码的一些评论:
Product
的4个新实例添加到阵列时,有4个内存泄漏。该数组会保留您添加到其中的对象,因此添加它们时应autorelease
Product
个实例。dealloc
中,您应该说self.title = nil
而不是[self.title release]
。尽管您的版本有效,但它会为您提供包含对已释放对象(=悬空指针)的引用的实例变量。因为这种情况发生在dealloc
并且Product
对象即将消失,现在不会对您造成伤害,但是如果您将来将在某些时候被咬伤保持这种风格。initWithProduct
中,您不得查看if (title!= nil)
之类的内容 - 只需直接说出self.title = inTitle
即可。毕竟,initWithProduct
是一个初始值设定项,就像init
一样,因此title
此时不能包含任何内容。希望这有帮助。
修改
实际上,最后一点可能就是为什么你看到单元格标题的“(null)”。您的支票if (title!= nil)
永远不会成立,因为在初始值设定项中实例变量title
为nil
,因此分配self.title = inTitle
永远不会发生。