根据选定的表视图行更新 UILabel

Posted

技术标签:

【中文标题】根据选定的表视图行更新 UILabel【英文标题】:Update UILabel based on selected table view rows 【发布时间】:2015-06-19 14:33:12 【问题描述】:

我有一个表格视图和一个文本字段。该人在该表格视图中选择的任何内容都将显示在文本字段中。

示例:在我的表格视图中选择“一”“二”“三”

如果我选择“one”,我的表格视图上会出现一个复选标记,并且“one”也会出现在我的文本字段中。

我知道如何使用 stringByAppendingString 将字符串添加在一起,所以当我选择“two”时,仍然选择“one”,我的标签将显示为“onetwo”

现在我的问题是:如果我要取消选择“一个”选项(或任何其他选项),我如何才能只删除此连接字符串的某个部分?

示例:如果我按此顺序选择“threeonetwo”并且我想取消选择“one”,我的标签现在将显示为“threetwo”。

谢谢。

更新:这是我到目前为止所做的,我被卡住了。

首先:我创建了一个可变数组:

NSMutableArray *toBeFilledTableData;

然后我分配它:

toBeFilledTableData = [[NSMutableArray alloc] init];

然后,如果用户从表格视图中选择选项,我将添加一个对象:

[toBeFilledTableData addObject:@"one"];

我改变了将文本字段显示为“threeonetwo”的想法,我想在两者之间添加一个分号,因此我希望外观为“three;one;two”。所以创建了一个字符串在末尾添加一个分号:

NSString *combinedForces

combinedForces = [toBeFilledTableData componentsJoinedByString:@";"]; (^ 但这并没有显示我的分号,所以我只是将分号添加到 addObject [除非有另一种方法])

然后我在我的文本字段中显示了该对象:

textField.text = combinedForces;

所以到目前为止,1. 我的列表没有填充,因为我单击了更多选项,2. 在每个选项之间插入分号正在成为一个难题。我会很感激任何帮助 =)

【问题讨论】:

根据您的新更新编辑了我的答案,请检查 【参考方案1】:

您可以维护一个数组或包含所选项目的集合,而不是删除字符串的那部分。

didSelectRowAtIndex 路径方法中,您将选定的字符串添加到数组(或将其删除)并调用updateLabel 方法,该方法从数组或集合的内容中创建一个字符串。

因此,每次发生更改时都会重新创建您的字符串。


如果你想知道选择的顺序,使用NSMutableOrderedSet,如果你不需要知道顺序,你可以使用NSMutableSet

【讨论】:

酷,我已经有一个用于表格视图的数组: NSArray *tableData = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];我不想从 tableview 中删除任何东西,只是从标签外观中删除。我该怎么办? 您有一个用于所选对象的单独数组。 At first, it's empty, when a row is selected, you add the object (string) to it, and later remove it on deselect. 这就是我所做的:我创建了我的可变数组:NSMutableArray *toBeFilledTableData;然后我分配它: toBeFilledTableData = [[NSMutableArray alloc] init];然后我只添加了一个对象:[toBeFilledTableData addObject:@"one"];然后我将该对象显示为我的标签: textField.text = [toBeFilledTableData objectAtIndex:indexPath.row];它显示得很好。现在,如果我想取消它,我添加了代码:[toBeFilledTableData removeObject:@"one"];问题:现在如何设置我的标签?因为 textField.text = [toBeFilledTableData objectAtIndex:indexPath.row];不起作用。 @the_fez 不要在评论中发布一堆代码。如果需要,请使用更多详细信息更新您的问题,以便人们在查看您的问题时看到并阅读它。【参考方案2】:

你可以在 didSelectRowAtIndexPath 和 didDeselectRowAtIndexPath 中使用下面的代码来做到这一点

NSString *lblString = @"";
    NSArray *indexPathArray = [self.tableView indexPathsForSelectedRows];
    for(NSIndexPath *index in indexPathArray)
    
        NSString *subStr = [arrayDatasource objectAtIndex:index.row]; //perticular choice from your choice array
        if([indexPathArray lastObject]!=index)
        
            lblString = [lblString stringByAppendingString:[subStr stringByAppendingString:@";"]];
        
         else  
        
           lblString = [lblString stringByAppendingString:subStr];
        



    

【讨论】:

不要把这段代码放在这两种方法中。将此代码放在它自己的方法中,并从两个表视图委托方法中调用它。您还应该使用可变字符串,而不是附加和重新分配不可变字符串。

以上是关于根据选定的表视图行更新 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

SQLite进阶-17.视图

如何在主视图的行选择上更新详细视图的表视图或在详细视图中加载新视图?

从选定索引处的表视图中的数组中删除

内部另一个表视图的表视图行高

使用来自单独的表视图控制器的选定单元格填充文本字段

尝试删除 NSUserdefault 数组中的表视图行