0

我有一个应用程序,它有一个UITableView. 它UITableViewUITableViewCells在另一个类中自定义定义的,CustomCell. 这些单元格UITableView通过在 中定义的按钮添加到UIViewController. 在单元格中有一个UIButton,在创建单元格时选择它,并且每次按下按钮时它们都会更改选定状态。我需要NSMutableArray创建一个包含每个单元格的选定状态的UIButton。表格视图的第 n 行中按钮的选定状态将位于NSMutableArray. 如果选择了按钮,我想将 1 添加到数组中,如果未选择按钮,我想将 0 添加到数组中。我将使用该数组来刷新 中的数据UITableView并稍后进行一些计算。

我的问题:

- 我不知道如何更改特定于我按下时按下的按钮的数组的值,因为该按钮是在另一个类中定义的。

- 如果我在第 n 行选择一个按钮,那么每隔 8 行,这些行上的按钮就会被选中,即使我还没有创建这些单元格,当我创建它们时,按钮也会被选中。(例如,如果我单击第 1 行上的按钮,第 9、17、25 行上的按钮......也会被选中/取消选中)

- 我发现使用该数组的唯一方法是每次需要它时创建一个新数组,方法是遍历每个单元格,UITableView如果选择/取消选择按钮,则添加 1s/0s。我确信有更好的方法。

这是我的代码:

CustomCell.h

@interface CustomCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UIButton *tickButton;

CustomCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    return self;
}

- (IBAction)tick:(UIButton *)sender {

    if ([sender isSelected]) {
        [sender setImage:[UIImage imageNamed:@"off"] forState:UIControlStateNormal];
        [sender setSelected:NO];
        _isTicked = [NSNumber numberWithInt:0];
    }
    else {
        [sender setImage:[UIImage imageNamed:@"on"] forState:UIControlStateSelected];
        [sender setSelected:YES];
        _isTicked = [NSNumber numberWithInt:1];
    }

}

主视图控制器.h

@interface SplitBillViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) IBOutlet UIBarButtonItem *addItem;
@property (strong, nonatomic) IBOutlet UITableView *itemTable;

主视图控制器.m

@implementation MainViewController{
    BOOL lastButtonPressed;
    NSInteger n;
    NSNumber *a;
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 2;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if (section==0) return n;
    return 4;
}

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

        CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
        }


        if ([indexPath row]%2==0){
            [cell setBackgroundColor:[UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:0.8]];
        }
        else{
            [cell setBackgroundColor:[UIColor colorWithRed:0.94 green:0.94 blue:0.94 alpha:0.9]];
        }
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.accessoryView = [UIView new];
        return cell;
    }

    }

}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        lastButtonPressed=NO;
        --n;
        [_itemTable reloadData];
}

- (IBAction)addItem:(UIBarButtonItem *)sender {
    lastButtonPressed=YES;
    ++n;
    [_itemTable reloadData];
    [_itemTable scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:n-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    [_itemTable endEditing:YES];
}

-(NSMutableArray*) returnTickArray{
    NSMutableArray *tickArray = [[NSMutableArray alloc] initWithCapacity:n];
    for (NSInteger i=0; i<n; i++){
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
    CustomCell *cell = (CustomCell *) [self.itemTable cellForRowAtIndexPath:indexPath];
       // NSLog([NSString stringWithFormat:@"%@",cell.isTicked]);
        if ([cell.tickButton isSelected]){
            a=[NSNumber numberWithInt:1];
        }
        else {
            a=[NSNumber numberWithInt:0];
        };
        [tickArray addObject:a];
    }
    return tickArray;
}

@end

当然,还有更多代码,但我没有复制任何我确定不会影响任何东西的东西。

谢谢!

4

3 回答 3

1

一旦像这样尝试,

1.取一个NSMutableArray作为选定的按钮。

2.当您当时选择特殊按钮时,将该indexpath.row值添加到数组中。

3.当您当时取消选择按钮时,检查该数组中是否存在 indexpath.row 值,如果是,则找到该对象的索引并从数组中删除该对象。

if([array containsObject:@"value"]){
        int n=[array indexOfObject:@"value"];
        [array removeObjectAtIndex:n];

    }

当你点击按钮时,这个方法会调用,在这个方法中你可以管理所有的东西,

- (IBAction)tick:(UIButton *)sender {

//here you will get tag value like sender.tag value.

if ([sender isSelected]) {
        [sender setImage:[UIImage imageNamed:@"off"] forState:UIControlStateNormal];
        [sender setSelected:NO];
        _isTicked = [NSNumber numberWithInt:0];

       NSString *value=[NSString stringWithFormat:@"%d",sender.tag];
       if([array containsObject:value]){
          int n=[array indexOfObject:value];
          [array removeObjectAtIndex:n];

       }
    }
    else {
        [sender setImage:[UIImage imageNamed:@"on"] forState:UIControlStateSelected];
        [sender setSelected:YES];
        _isTicked = [NSNumber numberWithInt:1];
        [array addObject:[NSString stringWithFormat:@"%d",sender.tag]];//if already present in array the skip this one
    }
}

否则,您将像这样使用直接获取 indexPath 值。

NSIndexPath *indexPath = [yourtableviewname indexPathForCell:(UITableViewCell *)sender.superview];
    NSLog(@"%d",indexPath.row);
于 2013-05-07T04:23:37.257 回答
0

- 如果我在第 n 行选择一个按钮,那么每隔 8 行这些行上的按钮就会被选中,即使我还没有创建这些单元格,当我创建它们时,按钮也会被选中。(例如,如果我单击第 1 行上的按钮,第 9、17、25 行上的按钮......也会被选中/取消选中)

那是因为细胞被重复使用。您需要在tableView:cellForRowAtIndexPath:. 对于此处的每个单元格,意味着每次调用此方法时,您都需要指定是否选择按钮。

于 2013-05-07T04:20:12.340 回答
0

您可以执行以下步骤吗?
您需要一个数组来跟踪选定的按钮。我将在该数组中保存相应按钮的 indexPath。创建一个数组作为属性

   @property (nonatomic,retain) NSMutableArray* selectedIndexPaths;

   // In viewDidLoad  
   self.selectedIndexPaths = [[NSMutableArray alloc]init];
  1. cellForRowAtIndexPath
    中以编程方式添加按钮。无需在自定义单元类中添加它

    if (cell == nil)
    {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    cell.textLabel.text= [NSString stringWithFormat:@"%d", indexPath.row];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:@"Press Me" forState:UIControlStateNormal];
    button.frame = CGRectMake(200, 10, 100,30);
    button.tag = indexPath.row;
    [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [cell addSubview:button];
    [cell bringSubviewToFront:button];
    }  
    
  2. 当您按下按钮时
    ,在 selectedIndexPath 数组中添加/删除按钮的 indexPath

    -(void)buttonPressed:(UIButton *)sender
    {
    NSLog(@"Button Pressed");
    
     NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell*)sender.superview];
    if([self.selectedIndexPaths containsObject:indexPath])
     {
       [self.selectedIndexPaths removeObject:indexPath];
    
     }
    else
    {
     [self.selectedIndexPaths addObject:indexPath];
    }
    NSLog(@"SelectedIndexPaths : %d",self.selectedIndexPaths.count);
    }  
    
  3. 现在您拥有所有选定按钮单元格的 indexPath。做你想做的

于 2013-05-07T07:06:57.287 回答