如何在UITableView中基于行输入(字母)添加另一个部分-swift

时间:2018-08-07 07:58:03

标签: ios swift uitableview

我是一个新的iOS程序。我正在创建一个与contact应用类似的示例应用。我不知道实际的应用程序如何工作。例如,我们的基于字母的表视图显示名称(例如以A开头的名称将保留在A部分中,而B将保留在B部分中,依此类推。并且当用户输入部分中不存在的名称时,将自动创建新部分。我不知道如何实现这样的目标。

这是我以编程方式创建UITableView的方式。不使用情节提要

private let cellId = "cellId"
private let array = ["Aname", "Bname", "Cname", "Dname"]
override func viewDidLoad() {
    super.viewDidLoad()

    tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
}

这是我自定义显示数据的方式

// Table View

扩展ContactListController {

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let label = UILabel()
    label.backgroundColor = .gray
    label.text = "A"
    return label

}
override func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


    return array.count


}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)


    cell.textLabel?.text = array[indexPath.row]



    return cell

}

}

对于我的期望输出,我想显示以A开头的名称,应该在A部分中,依此类推...

谢谢您的解释。

2 个答案:

答案 0 :(得分:1)

最简单的解决方法是方法Dictionary(grouping: by:)

  • 为节(keys)创建一个数组,为名称(people)创建字典,并使array可变

    var keys = [String]()
    var people = [String : [String]]()
    
    private var array = ["Aname", "Bname", "Cname", "Dname"]
    
  • 添加一种对数据进行分组的方法

    func groupData()
    {
        people = Dictionary(grouping: array, by: {String($0.first!)})
        keys = people.keys.sorted()
        tableView.reloadData()
    }
    

    如果要限制分组以仅考虑大写字母写

    people = Dictionary(grouping: array, by: {$0.range(of: "^[A-Z]", options: .regularExpression) != nil ? String($0.first!) : "Unknown"})
    
  • viewDidLoad
  • 调用方法

    override func viewDidLoad() {
        super.viewDidLoad()
    
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
        groupData()
    }
    
  • 代替viewForHeaderInSection实施titleForHeaderInSection

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return keys[section]
    }
    
  • 其他相关的表格视图数据源和委托方法是

    override func numberOfSections(in tableView: UITableView) -> Int {
        return keys.count
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let letter = keys[section]
        return people[letter]!.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        let letter = keys[indexPath.section]
        let item = people[letter]![indexPath.row]
        cell.textLabel!.text = item
        return cell
    }
    

要添加新项目,请将名称附加到array并调用groupData

如果要在插入节和行时提供更复杂的动画解决方案,则必须自己编写逻辑。可以使用键的设计数组和名称的字典,还可以使用自定义结构,包括字母索引和行数组。

答案 1 :(得分:0)

您应该先在表视图中显示之前联系数据联系人,每个键将在表视图中显示一个部分,我有示例代码组数据:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSArray *arrNameContact = @[@"Aname",@"Bname",@"Cname",@"Dname",@"Dname1",@"Aname1",@"Ename1",@"Bname1"];
    NSMutableArray *arrKey = [self getArrayKeyFromArrayName:arrNameContact];

    NSMutableDictionary *dict =@{}.mutableCopy;

    for (NSString *key in arrKey) {
        NSMutableArray *arrContactWithKey = [[NSMutableArray alloc]init];
        for (NSString *name in arrNameContact) {
            if ([name hasPrefix:key]) {
                [arrContactWithKey addObject:name];
            }
        }
        [dict setObject:arrContactWithKey forKey:key];
    }
    NSLog(@"%@",dict);
}

// Get All alphabet
- (NSMutableArray *) getArrayKeyFromArrayName:(NSArray *)arrName {
    NSMutableArray *arrKey = @[].mutableCopy;
    for (int i = 0; i < arrName.count; i++) {
        NSString *strFirstCharacter = [arrName[i] substringToIndex:1];
        if (arrKey.count == 0) {
            [arrKey addObject:strFirstCharacter];
        } else {
            if (![self checkItemExistKey:strFirstCharacter inArray:arrKey]) {
                [arrKey addObject:strFirstCharacter];
            }
        }
    }
    return arrKey;
}

- (BOOL) checkItemExistKey:(NSString *) key inArray:(NSArray *)arrKey {
    for (NSString *keyCheck in arrKey) {
        if ([keyCheck isEqualToString:key]) {
            return TRUE;
        }
    }
    return FALSE;
}

组数据后的结果:

Printing description of dict:
{
    A =     (
        Aname,
        Aname1
    );
    B =     (
        Bname,
        Bname1
    );
    C =     (
        Cname
    );
    D =     (
        Dname,
        Dname1
    );
    E =     (
        Ename1
    );
}

祝你好运!