0

我有一个名为 Product 的类,其中包含一些属性,我想让我的类成为名为 Products 的产品列表的基础。这个列表可以在 UITableView 中访问,以填充 Products 的内容。

此外,每个产品的内容将由 Web 服务填充。

我的代码是:

@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;
}

在他们中。我有:

编辑 现在我的单元格的标题显示为(空)

- (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;
    }

提前致谢!

4

2 回答 2

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
于 2013-07-02T19:13:30.587 回答
2

不是您的问题的答案,而是关于您的代码的一些评论:

  • 当您将 4 个新实例添加Product到阵列时,您有 4 个内存泄漏。该数组保留了您添加到其中的对象,因此您应该autoreleaseProduct添加它们时使用实例。
  • 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永远不会发生。

于 2013-07-02T19:32:24.817 回答