隐藏一个后移动所有视图

时间:2014-10-18 17:23:07

标签: swift ios8 xcode6

在我的Android应用中,我能够创建一个包含行的标准表,并在其中包含文本框。根据用户首选项,显示/隐藏其中一些行。例如,如果用户不想输入现金/信用额度,或跟踪给予客户的任何折扣等,则不应出现这些字段。

我只是隐藏整行,就像html中的DIV一样,其余的行会很好地移动。

例如:

元素1 element2
element3

我想删除元素2,然后3向上移动并占据2位。我可能会有8个这样的字段。

然而,在iOS中,这可能是这样的吗?一些谷歌搜索产生的结果或多或少使得这对于显示/隐藏表单元素并使所有内容都很好地滑动看起来非常复杂。一些解决方案包括动态设置非常复杂的自动布局方案,或者根本不使用自动布局等。然后,这些解决方案适用于旧版本的ios。

这样的事情可能吗?我怎么能做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用UITableView
UITableView允许您表示单元格列表并使用动画操作它们(添加,删除,重新排序) 在你的情况下,每个选项都是UITableViewCell。

  1. 创建UITableViewController的子类
  2. 设置UITableView的数据源
  3. 实施UITableViewDataSource
  4. 这是2个功能

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell  
    
    1. 更新TableView项目
    2. 您可以通过编辑对象并在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()
      
      1. 您可以在tableView
      2. 中删除或添加特定项目

        首先通过删除或添加对象来更新您的对象,而不是调用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.
            }
          }