1

现在我是 IOS 编程的初学者,我创建了一个视图并在其中放置了一个 tableview,然后我使用我想用于 tablecell 的模板创建了一个 xib 并为该调用创建了一个类。表格单元格有一个标签(在加载单元格时设置)、一个开关和一个文本字段。

该表加载良好,标签显示了它们应该显示的正确文本,从数据库加载了 12 行。SQLite。

问题:当我编辑第 1 行中的文本字段时,第 9 行中的文本字段被编辑,反之亦然。当我在第 2 行编辑时,第 10 行被编辑!直到第 4,12 行,不仅是文本字段,还有切换开关。

一些代码:AlertViewController.h

@property (weak, nonatomic) IBOutlet UITableView *table;

警报视图控制器.m

@synthesize table;

static NSString *alertCellID=@"AlertViewCell";

----some code here ----
-(void)ViewDidLoad
{
---some code here----
    self.table.delegate=self;
    self.table.dataSource=self;

    if(managedObjectContext==nil)
    {
        id appDelegate=(id)[[UIApplication sharedApplication] delegate];
        managedObjectContext=[appDelegate managedObjectContext];
    }
    [self loadCategories];

    [table registerNib:[UINib nibWithNibName:@"AlertViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:alertCellID];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [arrCategories count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Category *cat=[arrCategories objectAtIndex:indexPath.row];
    AlertViewCell *cell = [tableView dequeueReusableCellWithIdentifier:alertCellID];
    UILabel *lblGroupName=(UILabel *)[cell viewWithTag:101];
    lblGroupName.text=cat.nameEn;
    UITextField *txtHours=(UITextField *)[cell viewWithTag:103];
    txtHours.delegate=self;
    return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

编辑: 我不知道它是否与适合 8 条记录的滚动大小有关?以及如何克服呢?

4

1 回答 1

1

好的,我解决了如下:

首先问题是因为我使用dequeuereusablecellwithidentifier,它似乎每x行返回相同的引用,其中x是屏幕上出现的行数而不滚动,所以这使得单元格1=单元格9,单元格2=单元格10 以此类推。

所以为了解决这个问题,我必须使标识符唯一,并且为了解决标识符用于加载注册笔尖的问题,我必须使用这个唯一标识符名称注册笔尖。这是更改:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *identifier=[NSString stringWithFormat:@"%@%d",alertCellID,indexPath.row];
    [table registerNib:[UINib nibWithNibName:@"AlertViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:identifier];
    Category *cat=[arrCategories objectAtIndex:indexPath.row];

    AlertViewCell *cell = (AlertViewCell *)[tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    if(!cell)
    {
        NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"AlertViewCell" owner:self options:nil];
        cell=[topLevelObjects objectAtIndex:0];
    }
    UILabel *lblGroupName=(UILabel *)[cell viewWithTag:101];
    lblGroupName.text=cat.nameEn;
    UITextField *txtHours=(UITextField *)[cell viewWithTag:103];
    txtHours.delegate=self;
    return cell;
}
于 2013-04-17T01:17:22.487 回答