在我的Android应用中,我能够创建一个包含行的标准表,并在其中包含文本框。根据用户首选项,显示/隐藏其中一些行。例如,如果用户不想输入现金/信用额度,或跟踪给予客户的任何折扣等,则不应出现这些字段。
我只是隐藏整行,就像html中的DIV一样,其余的行会很好地移动。
例如:
元素1
element2
element3
我想删除元素2,然后3向上移动并占据2位。我可能会有8个这样的字段。
然而,在iOS中,这可能是这样的吗?一些谷歌搜索产生的结果或多或少使得这对于显示/隐藏表单元素并使所有内容都很好地滑动看起来非常复杂。一些解决方案包括动态设置非常复杂的自动布局方案,或者根本不使用自动布局等。然后,这些解决方案适用于旧版本的ios。
这样的事情可能吗?我怎么能做到这一点?
谢谢!
答案 0 :(得分:1)
使用UITableView 。
UITableView允许您表示单元格列表并使用动画操作它们(添加,删除,重新排序)
在你的情况下,每个选项都是UITableViewCell。
这是2个功能
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell
您可以通过编辑对象并在tableView
上调用reloadData方法轻松地重新加载tableView// Add, remove or replace your objects you want to display in table View
objects = ["1", "2", "3"]
// call tableView to reload it's data. TableView will call dataSource delegates methods and update itself
tableView.reloadData()
首先通过删除或添加对象来更新您的对象,而不是调用update tableView并说明它应该添加或删除的单元格(在哪个位置)。你也可以说它应该使用什么类型的动画
var index = 2
// Update your object Model, here we remove 1 item at index 2
objects.removeAtIndex(index)
// saying tableView to remove 1 cell with Fade animation.
tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: 0)], withRowAnimation: .Fade)
这是完整的代码示例
class MasterViewController: UITableViewController {
var objects = ["Option 1", "Option 2", "Option 3"]
func insert(obj: String, at: Int) {
objects.append(obj)
let indexPath = NSIndexPath(forRow: at, inSection: 0)
self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}
func deleteAt(index: Int) {
objects.removeAtIndex(index)
tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: 0)], withRowAnimation: .Fade)
}
override func viewDidLoad() {
super.viewDidLoad()
}
func insertNewObject(sender: AnyObject) {
insert(NSDate.date().description, at: 0)
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let object = objects[indexPath.row]
cell.textLabel?.text = object
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
deleteAt(indexPath.row)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}