Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在UITableView-swift中基于行输入(字母表)添加另一节_Ios_Swift_Uitableview - Fatal编程技术网

Ios 如何在UITableView-swift中基于行输入(字母表)添加另一节

Ios 如何在UITableView-swift中基于行输入(字母表)添加另一节,ios,swift,uitableview,Ios,Swift,Uitableview,我是一名新的iOS编程人员。我正在创建一个类似于contactapp的示例应用程序。我想知道真正的应用程序是如何工作的。例如,我们的tableview基于类似字母的名称显示名称,以A开头,将保留在A部分,B将保留在B部分,依此类推。当用户输入部分中不存在的名称时,将自动创建新的部分。我想知道我怎样才能做到这一点 这就是我以编程方式创建UITableView的方式。不使用故事板 private let cellId = "cellId" private let array = ["Aname",

我是一名新的iOS编程人员。我正在创建一个类似于
contact
app的示例应用程序。我想知道真正的应用程序是如何工作的。例如,我们的tableview基于类似字母的名称显示名称,以
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
扩展联系人列表控制器{

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
部分,依此类推


谢谢你的解释

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

- (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
    );
}

祝你好运

最简单的解决方案是方法
字典(分组:by:)

  • 为节(
    )创建一个数组,为姓名(
    )创建一个字典,并使
    数组
    可变

    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
    implement
    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
    }
    
要添加新项目,请将名称附加到
数组
并调用
groupData


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

如果没有数据显示平均节数0,则可以为这种情况传递一个新节。显示代码。这取决于这些部分是如何实施的,先生!我已经更新了我的问题@vadian,谢谢主席先生的精彩解释。我运行代码,并且工作得很好。但是你能解释一下带有前两行代码的
groupData
函数吗?分组API在中有描述。它从数组中创建一个以第一个字母为键的字典。我还有一个疑问。我想把只有A…Z的部分分组,只有当用户输入像数字或其他东西时,它才应该显示在一个独特的部分,用户输入在A…Z旁边,用一些符号像#或其他什么…谢谢你,先生!现在我明白了。谢谢你抽出时间。