创建一个自定义Object数组来填充它并将其内容填充到UITableView中

时间:2013-07-02 19:02:15

标签: objective-c uitableview nsmutablearray

我有一个名为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;
    }

提前致谢!

2 个答案:

答案 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)永远不会成立,因为在初始值设定项中实例变量titlenil,因此分配self.title = inTitle永远不会发生。