我是一个新的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
部分中,依此类推...
谢谢您的解释。
答案 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
);
}
祝你好运!