如何按字母顺序排序标签数组?能否不使用UITableView实现?
不用UITableView实现标签文本按字母排序的方案
当然可以完全不用UITableView搞定这个需求!我分两种常见的场景给你具体说明:
场景1:仅更新标签文本,不调整布局位置
如果你的标签位置是固定的,只是需要把每个标签的文本替换成排序后的字母,直接遍历排序好的字母数组给标签赋值就行:
Swift 代码示例
// 假设你已经有排序完成的字母数组 sortedLetters // labelArray 是你的UILabel实例数组 for (index, letter) in sortedLetters.enumerated() { guard index < labelArray.count else { break } labelArray[index].text = letter }
Objective-C 代码示例
// sortedLetters 是已排序的字母数组,labelArray 是UILabel实例数组 for (NSInteger i = 0; i < sortedLetters.count; i++) { if (i >= labelArray.count) break; UILabel *targetLabel = labelArray[i]; targetLabel.text = sortedLetters[i]; }
场景2:需要调整标签的排列顺序(重新布局)
如果要让标签本身也按字母顺序重新排列位置(比如横向/纵向排列的标签组),可以先把标签和对应字母配对,排序后再重新布局:
Swift 代码示例
// 1. 把标签和对应字母配对成元组数组 var labeledLetterPairs = zip(labelArray, letterArray).map { ($0.0, $0.1) } // 2. 按字母顺序排序配对数组 labeledLetterPairs.sort { $0.1 < $1.1 } // 3. 提取排序后的标签数组 let sortedLabels = labeledLetterPairs.map { $0.0 } // 4. 重新布局标签(以横向排列为例) var currentX: CGFloat = 20 // 起始X坐标 let startY: CGFloat = 50 // 起始Y坐标 let labelHeight: CGFloat = 30 for label in sortedLabels { // 用intrinsicContentSize获取标签的自适应宽度 let labelWidth = label.intrinsicContentSize.width label.frame = CGRect(x: currentX, y: startY, width: labelWidth, height: labelHeight) // 更新下一个标签的起始X currentX += labelWidth + 20 } // 如果用AutoLayout,替换成约束更新逻辑即可,比如用SnapKit: // var previousLabel: UILabel? // for label in sortedLabels { // label.snp.remakeConstraints { make in // make.top.equalToSuperview().offset(startY) // make.height.equalTo(labelHeight) // if let prev = previousLabel { // make.leading.equalTo(prev.snp.trailing).offset(20) // } else { // make.leading.equalToSuperview().offset(20) // } // } // previousLabel = label // } // view.layoutIfNeeded()
Objective-C 代码示例
// 1. 构建标签与字母的配对数组 NSMutableArray *labeledLetterPairs = [NSMutableArray array]; for (NSInteger i = 0; i < labelArray.count; i++) { if (i >= letterArray.count) break; UILabel *label = labelArray[i]; NSString *letter = letterArray[i]; [labeledLetterPairs addObject:@{@"label": label, @"letter": letter}]; } // 2. 按字母排序配对数组 [labeledLetterPairs sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSString *letter1 = obj1[@"letter"]; NSString *letter2 = obj2[@"letter"]; return [letter1 compare:letter2]; }]; // 3. 提取排序后的标签数组 NSMutableArray *sortedLabels = [NSMutableArray array]; for (NSDictionary *pairDict in labeledLetterPairs) { [sortedLabels addObject:pairDict[@"label"]]; } // 4. 重新布局标签(横向排列为例) CGFloat currentX = 20; CGFloat startY = 50; CGFloat labelHeight = 30; for (UILabel *label in sortedLabels) { CGSize intrinsicSize = label.intrinsicContentSize; label.frame = CGRectMake(currentX, startY, intrinsicSize.width, labelHeight); currentX += intrinsicSize.width + 20; } // AutoLayout版本的约束更新: // UILabel *previousLabel = nil; // for (UILabel *label in sortedLabels) { // [label removeConstraints:label.constraints]; // label.translatesAutoresizingMaskIntoConstraints = NO; // // NSArray *constraints = @[ // [label.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:startY], // [label.heightAnchor constraintEqualToConstant:labelHeight] // ]; // // if (previousLabel) { // [constraints addObject:[label.leadingAnchor constraintEqualToAnchor:previousLabel.trailingAnchor constant:20]]; // } else { // [constraints addObject:[label.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:20]]; // } // // [NSLayoutConstraint activateConstraints:constraints]; // previousLabel = label; // } // [self.view layoutIfNeeded];
如果你的标签是自定义视图(不是UILabel),逻辑也是完全相通的——只要能获取/设置视图对应的文本内容,然后按上述步骤配对、排序、更新布局就可以了。
内容的提问来源于stack exchange,提问作者Wizzardzz
相关产品推荐
相关产品推荐

