1

我有一个 uitableView,在每一行我有 4 个按钮,所有按钮的名称都是“W”,

当我运行程序时:第一行的前 4 个按钮只有“W”

当我滚动我的表格时,我会得到更多的按钮名称“W”

有谁知道是什么问题?

提前致谢

我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithFrame:CGRectZero];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;

int column = 4;
for (int i=0; i<column; i++) {

    // position in the parent view and set the size of the button
    UIButton *myButton = [[UIButton alloc]initWithFrame:CGRectMake(0.5+83*i,10, 80,115)];
    myButton.tag=(column*indexPath.row)+i;
    [cell.contentView addSubview:myButton];
    [myButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    myButton.backgroundColor = [UIColor whiteColor];


    UILabel *btnTitle = [[UILabel alloc] initWithFrame:CGRectMake(25, 10, 30, 10)];
    [btnTitle setText:@"W"];
    [btnTitle setTextColor:[UIColor blackColor]];
    [myButton addSubview:btnTitle];

           }
return cell;
}

在此处输入图像描述

4

3 回答 3

2

阿比泽姆说。“单元格将有许多按钮......和 ​​btnTitles” 他是对的。

您的代码将在滚动表格视图时调用“内存不足”和“慢速”。

创建一个 CustomTableViewCell 类。


@interface CustomTableViewCell : UITableViewCell
{
    NSArray *_buttons;
}
@property (nonatomic, strong) IBOutlet UIButton *button1, button2, button3, button4;
@property (nonatomic, strong, readonly) NSArray *buttons;
@end

@implementation CustomTableViewCell
...
@dynamic buttons;
- (NSArray*)buttons
{
   if (_buttons == nil) {
       _buttons = [NSArray arrayWithObjects:self.button1, self.button2, self.button3, self.button4, nil];
   }
   return _buttons; // I fixed it _button --> _buttons
}
@end

  • 创建一个空的 xib 文件。
  • 拖放一个 UITableViewCell。
  • 并在 UITableViewCell 上拖放 4 个 UIButton。
  • 选择 UITableViewCell 自定义类并将其更改为 CustomTableViewCell。
  • 将 button1、button2、button3、button4 链接到 xibs 项。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = (CustomTableViewCell*)[[[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil] objectAtIndex:0];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int column = 4;
for (int i=0; i<column; i++) {
    // position in the parent view and set the size of the button
    UIButton *myButton = [cell.buttons objectAtIndex:i];
    //myButton.frame = CGRectMake(0.5+83*i,10, 80,115); You can design on interface builder
    myButton.tag=(column*indexPath.row)+i;
    [cell.contentView addSubview:myButton];
    [myButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    myButton.backgroundColor = [UIColor whiteColor];

    //myButton.textLabel.frame = CGRectMake(25, 10, 30, 10); You can design on interface builder
    [myButton.textLabel. setText:@"W"];
    [myButton.textLabel. setTextColor:[UIColor blackColor]];
 }
return cell;
}

  • 对不起。不是 "ni" --> "nil"
  • 返回 _button --> 返回 _buttons

@interface CustomTableViewCell : UITableViewCell
{
    NSArray *_buttons;
}
@property (nonatomic, strong) IBOutlet UIButton *button1, button2, button3, button4;
@property (nonatomic, strong, readonly) NSArray *buttons; // <----- Check it.
@end
于 2012-08-02T07:59:36.283 回答
1

我无法评论答案,因此我更改了这个答案, boiljong 的解决方案是正确的。作为 booiljoung 的帖子,您可以轻松地在情节提要中使用它。首先,您应该在情节提要中自定义 UITableViewCell。UITableView 的第一行是一个 UITableViewCell(如果您在将 UITableView 添加到情节提要时没有删除它)。然后为其添加 4 个按钮并将其类设置为 CustomUITableViewCell。将按钮链接到您的 CustomUITableViewCell。最重要的是不要忘记将Identifier更改为您在代码 tableview dequeueReusableCellWithIdentifier 中使用的标识符。请看我上传的截图。并且您的代码中的错误是由拼写错误引起的 ni 应该是n l并且 _button 应该是_buttons 故事板中的自定义 UITableViewCell

旧答案 仅当单元格为零时才需要创建按钮,如果单元格不为零,则意味着 tableview 正在重用您使用按钮创建的“旧”单元格。当调用 dequeueReusableCellWithIdentifier 时,它总是尽可能重用单元格。例如,使用不在当前屏幕中的单元格。他们已经有 4 个名为“W”的按钮。因此,每次新进入的单元格在滚动时都会多出 4 个按钮。您可以将按钮创建代码移动到代码括号中 if ( cell == nil ) {...}

但是在滚动到新行时很难操作按钮的标题。最好用自己的 UITableViewCell 自定义。您可以从http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7-SW18找到参考。

于 2012-08-02T07:50:55.440 回答
0

因为您已经从下面粘贴的代码中编写了 Button

if (cell == nil) { cell = [[UITableViewCell alloc] initWithFrame:CGRectZero]; }

您可以复制该行代码并将其粘贴到下面的代码行之后

cell = [[UITableViewCell alloc] initWithFrame:CGRectZero];

还有一个人认为您正在单独创建文本标签,即使您可以将按钮标题指定为

[myButton setTitle:@"Somethig" forState:UIControlStateNormal];

这样你也可以节省内存

于 2012-08-02T08:11:02.713 回答