5

私はこれに慣れていないので、ご容赦ください:

UITableView が埋め込まれた UIScrollView を含む IB に .xib があります。カスタム UITableViewCells を UITableView にロードしたいと思います。IB で 4 つまたは 5 つのカスタム セルを作成しましたが、最初のセルを正しくロードできません。

IB からの関連するスクリーンショットは次のとおりです。

.xib カスタムセル

IB で作成したカスタム UITableViewCell のクラスを、作成した「itemCell」という UITableView クラスに設定しました。さらに、3 つのテキスト フィールド アウトレットとデリゲートを「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

rootcontroller .xib の実装ファイルである filecontroller.m で、ユーザーがボタンを押すことに基づいて新しいセルを作成し (それを配列に追加)、テーブルビューをリロードします。エラーは発生していませんが、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];
4

3 に答える 3

8

iOS 5以降、次の関数を使用して、セルを再利用するためにペン先からUITableViewCellをロードできるようになりました。

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

  1. まず、UITableViewCellのみを含むIBファイルを作成するようにしてください
  2. [インスペクターの識別]で:UITableViewCellのクラスを「itemCell」に設定します ここに画像の説明を入力してください
  3. 属性インスペクターの下:UITableViewCellの識別子を「itemCellIdentifier」に設定します ここに画像の説明を入力してください
  4. viewDidLoadで:次のコードを配置し、itemCellNibNameをUITableViewCellを含むnibの名前に置き換えます。

    NSString *myIdentifier = @"itemCellIdentifier";
    [self.tableView registerNib:[UINib nibWithNibName:@"itemCellNibName" bundle:nil] forCellReuseIdentifier:myIdentifier];
    
  5. cellForRowAtIndexPathに次のコードを配置します。これで、itemCellに設定し、nibに接続した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;
    }
    

また、UIScrollView内にUITableViewを含めたくない場合は、UIScrollViewがすでにUITableViewに組み込まれているため、適切なセルキューが可能になります。

また、配列からデータをプルし始める前に、まずこれの骨組みを理解することをお勧めします。

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

また、他の誰かが言及したように、配列には、実際のセル自体ではなく、UITableViewCellsにデータを取り込むデータが含まれています。

于 2012-12-30T03:46:56.680 に答える
3

あなたの

- (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!"];
}

セルのプロパティは、インターフェイス ビルダーでカスタム セルに接続したものであれば何でもかまいません。

それが役に立てば幸い!

于 2012-12-29T23:50:06.307 に答える
1

正しくない点がいくつかあります。

  • クラス名が大文字で始まるitemCell->ItemCell
  • セルを再利用する必要があります。これを行う方法として、インデックス パスごとに個別のセルを作成します。
  • 配列には、itemsセルではなく、テーブルのデータ ソースのみを含める必要があります
  • リロード データを呼び出す代わりに、テーブルに行を 1 つだけ追加し、アニメーション化することもできます。

次のようなものを試してください:

- (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 なしで書いたので、エラーがあるかもしれません

于 2012-12-29T23:50:56.650 に答える