点击按钮

时间:2016-05-07 12:12:45

标签: ios objective-c uitableview

我希望在单击按钮时获取多个tableview选择的值。我检查了很多stackoverflow问题,但无法得到答案。我知道很多人已经实现了这一点,所以我请求有人指导我从tableview获取值。我可以从tableview中选择多个值。我能看到勾选标记。

以下是我的代码

.h file
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) IBOutlet UITableView *specTableView;

@property (nonatomic, retain) NSArray *arForTable;
@property (nonatomic, retain) NSMutableArray *arForIPs;//to capture ids
- (IBAction)btnActionToGetValues:(id)sender;

.m file

- (void)viewDidLoad {
 self.arForTable=[NSArray arrayWithObjects:@"value1",@"value2",@"value3",@"value4", nil];
    self.arForIPs=[NSMutableArray array];

}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    if([self.arForIPs containsObject:indexPath]){
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }
    cell.textLabel.text=[self.arForTable objectAtIndex:indexPath.row];
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if([self.arForIPs containsObject:indexPath]){
        [self.arForIPs removeObject:indexPath];
    } else {
        [self.arForIPs addObject:indexPath];
    }
    [tableView reloadData];

}

//button action for getting values
- (IBAction)btnActionToGetValues:(id)sender {
NSLog(@"ids %@",arForIPs);
}

我收到了这个输出

  

ids(       &#34; {length = 2,path = 0 - 1}&#34;,       &#34; {length = 2,path = 0 - 2}&#34; )

我的预期输出是

  

ids(       &#34;值1&#34 ;,       &#34;值2&#34; )

如果有人已经为此工作过,请告诉我。

3 个答案:

答案 0 :(得分:1)

试试这个

-  (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if([self.arForIPs containsObject:[self.arForTable objectAtIndex:indexPath.row]]){
    [self.arForIPs removeObject:[self.arForTable objectAtIndex:indexPath.row]];
} else {
    [self.arForIPs addObject:[self.arForTable objectAtIndex:indexPath.row]];
}
[tableView reloadData];

}

CellforRowatIndexpath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if([self.arForIPs containsObject:[self.arForTable objectAtIndex:indexPath.row]]){
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
} else {
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}
cell.textLabel.text=[self.arForTable objectAtIndex:indexPath.row];
return cell;
}

输出你可以

//button action for getting values
- (IBAction)btnActionToGetValues:(id)sender {
NSLog(@"ids %@",arForIPs);
}

答案 1 :(得分:0)

我猜你可以创建一个新数组,例如:

NSMutableArray *arr = [NSMutableArray array];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if([self.arForIPs containsObject:indexPath]){
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    [arr addObject:self.arForTable[indexPath.row]];
} else {
    [cell setAccessoryType:UITableViewCellAccessoryNone];
    [arr removeObject:self.arForTable[indexPath.row]];
}
cell.textLabel.text=[self.arForTable objectAtIndex:indexPath.row];
return cell;
}

- (IBAction)btnActionToGetValues:(id)sender {
NSLog(@"ids %@",arr);
} 

答案 2 :(得分:0)

您在日志中看到的是您的单元格的indexPath值。 length值是路径中的项目数(2),path值显示用户点击的单元格的行和部分。

如果您将使用索引路径值来获取对单元格的引用;您可以询问单元格是否打开了复选标记。您还在arForTable数组中保留值。因此,您使用tableView中的索引路径向arForTable数组询问值。我可能会像这样写didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSString *valueFromArray = [[self arForTable] objectAtIndex:[indexPath row]]; 

if([self.arForIPs containsObject:valueFromArray]){
    [self.arForIPs removeObject:valueFromArray];
} else {
      [self.arForIPs addObject:valueFromArray];
}
[tableView reloadData];

}

当然,这会导致cellForRowAtIndexPath中断。所以你还需要更新它。也许取而代之:

 if([self.arForIPs containsObject:indexPath]){
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
} else {
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}
cell.textLabel.text=[self.arForTable objectAtIndex:indexPath.row];

有类似的东西:

NSString *valueString = [[self arForTable] objectAtIndex:[indexPath row]];
if([self.arForIPs containsObject:valueString]){
    [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
} else {
    [cell setAccessoryType:UITableViewCellAccessoryNone];
}
cell.textLabel.text=valueString;

通常在tableView中,您会发现数组(arForTable)保存数据,因为数组的index属性与tableView的row属性匹配我们可以使用该匹配来查询数组,以查找与我们正在显示的tableView行对应的数据。