Ios 如何在UITableView-swift中基于行输入(字母表)添加另一节
我是一名新的iOS编程人员。我正在创建一个类似于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",
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
implementtitleForHeaderInSection
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旁边,用一些符号像#或其他什么…谢谢你,先生!现在我明白了。谢谢你抽出时间。