如何在IB中创建自定义UITableViewCell类以加载到UITableView?

时间:2012-12-29 23:28:58

标签: objective-c ios uitableview

我是新手,请耐心等待:

我在IB中有一个包含UIScrollView的.xib,其中嵌入了UITableView。我想将自定义UITableViewCells加载到UITableView中。我在IB中创建了四个/五个自定义单元格,但无法正确加载第一个。

以下是IB的相关截图:

.xib custom cell "itemCell"

我已经将在IB中创建的自定义UITableViewCell的类设置为我创建的名为“itemCell”的UITableView类。此外,我已将三个文本字段出口和代理连接到“itemCell”。

这是itemCell.h:

#import <UIKit/UIKit.h>

@interface itemCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UITextField *quantityTextField;
@property (weak, nonatomic) IBOutlet UITextField *itemTextField;
@property (weak, nonatomic) IBOutlet UITextField *priceTextField;

@end

这是itemCell.m:

#import "itemCell.h"

@implementation itemCell
@synthesize quantityTextField,itemTextField,priceTextField;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code

    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

在filecontroller.m中,它是rootcontroller .xib的实现文件,我根据用户按下按钮(将其添加到数组)创建一个新单元格,然后重新加载tableview。我没有错误,但我得到的是正常的单元格,而不是我在IB中创建的单元格。这是rootcontroller.m。任何帮助表示赞赏。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    scrollView =(UIScrollView *)self.view;
    items = [[NSMutableArray alloc] init];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [items count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        return [items objectAtIndex:[indexPath row]];
}

- (UITableViewCell *)initiateNewCell{
    itemCell *cell = [[itemCell alloc] init];
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    return cell;
}

- (IBAction)addItem:(id)sender {
    //creates the new cell to be added
    [items addObject:[self initiateNewCell]];
    [self.tableView reloadData];

3 个答案:

答案 0 :(得分:8)

从iOS 5开始,您现在可以使用以下功能从笔尖加载UITableViewCell以进行单元格重用。

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

  1. 首先确保创建仅包含UITableViewCell
  2. 的IB文件
  3. 在识别检查器下:将UITableViewCell的类设置为“itemCell” enter image description here
  4. 在属性检查器下:将UITableViewCell的标识符设置为“itemCellIdentifier” enter image description here
  5. 在viewDidLoad中:放置以下代码,并将itemCellNibName替换为包含UITableViewCell的nib的名称。

    NSString *myIdentifier = @"itemCellIdentifier";
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier];
    
  6. 在cellForRowAtIndexPath中:放置以下代码,您现在可以访问在itemCell上设置的IBOutlet属性,并在笔尖中连接。

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    {
         static NSString *myIdentifier = @"itemCellIdentifier";
    
         itemCell *cell = (itemCell *)[tableView dequeueReusableCellWithIdentifier:myIdentifier];
         cell.textLabel.text = [NSString stringWithFormat:@"Test Row:%i!",indexPath.row];
         return cell;
    }
    
  7. 另外:您不希望在UIScrollView中包含UITableView,UIScrollView已经内置在UITableView中,允许正确的单元格排队。

    另外:我建议你在开始从数组中提取数据之前先解决这个问题。

        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
             return 10;
        }
    

    另外:正如其他人提到的那样,数组包含将填充UITableViewCells的数据,而不是实际的单元格本身。

答案 1 :(得分:2)

在你的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //This identifier string needs to be set in cell of the TableViewController in the storyboard
    static NSString *CellIdentifier = @"Cell";

    // Resuse the cell
    SomeCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // If there are no cell to be reused we create a new one
    if(cell == nil) {
        cell = [SomeCustomCell new];
    }

    // Configure the cell...
    NSString *someString = [yourArrayWithStringsOrWhatEver objectAtIndex:indexPath.row];

    // Setting the some property of your custom cell
   [cell.yourSpecificCellProperty someString];

   [cell.yourOtherSpecificCellProperty setText:@"What Ever your want!"];
}

您的单元格的属性可以是您在界面构建器中连接到自定义单元格的任何内容。

希望它有所帮助!

答案 2 :(得分:1)

有一些事情是不对的:

  • 班级名称以大写字母itemCell开头 - &gt; ItemCell
  • 您应该重复使用该单元格。您希望这样做,您将为每个索引路径创建一个单独的单元格。
  • items数组应该只包含表格的数据源,而不是您的单元格
  • 而不是调用重新加载数据,您可以只向表中添加一行,也可以将其设置为动画

尝试类似:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    scrollView =(UIScrollView *)self.view;
    items = [[NSMutableArray alloc] init];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [items count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[NSBundle mainBundle] loadNibNamed:@"itemCell" owner:self options:nil].lastObject;
        cell.reuseIdentifier = CellIdentifier;
    }

    // Do any additional setup to the cell

    return cell;
}

- (IBAction)addItem:(id)sender {
    [items addObject:[NSNumber numberWithInt:items.count]]; // Here comes the data source
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:items.count - 1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
}

PS:我是在没有IDE的情况下编写的,因此可能会出现一些错误