2016-09-14 159 views
0

环境:如何放置工具栏上方(或下方)滚动的tableview

  • 的Xcode 7.3.1
  • 的iOS 9.3
目的:

    与工具栏可滚动表视图(或不同按钮)放置在相对于滚动表的固定位置(上方或下方)。
STORYBOARD:
    本来我只是有tableview,并添加了一个工具栏,但工具栏坐在tableview。
    后来我发现这个选项底部栏:不透明的工具栏,但无法弄清楚如何利用它/移动我的工具栏提供的位置(这看起来像我想要什么)
      storyboard
目前的结果:
    如果我只有几个细胞,例如:5或10,那么结果是“好”,而不是“大”:
      okay

    但是,如果我有大量的细胞,如:20,那么我试图避免的问题是立即的ately明显:

      bad
QUERY:
  • 我能完成我从Xcode的UI中想要什么?
    • 如果是这样,有人可以提供一些我需要采取的指针/步骤吗?
  • 或者我需要在Swift代码中执行此操作吗?
    • 再次感谢指针/步骤/通用代码示例。



  • WRT 2016年9月15日编辑在回答#1

    Embed the initial View Controller (the one with the buttons) in an `UINavigationController`.

    我不知道该怎么做,因为我唯一似乎能够到导航控制器内嵌入是标签栏控制器

      embed

    If not already created, make a `UITableViewController` class and link it to your Table View Controller.

    我已经有class ExistingLocationsViewController: UITableViewController { ... }(和class ExistingLocationTableViewCell: UITableViewCell { ... })联系,我相信,适当

    Add this code to the class in order to make the Toolbar appear and disappear when you are viewing the Table View:
     
        import UIKit 
        class ViewController: UITableViewController { 
         override func viewDidLoad() { 
          super.viewDidLoad() 
          navigationController?.isToolbarHidden = false 
         } 
         override func viewWillDisappear(_ animated: Bool) { 
          navigationController?.isToolbarHidden = true 
         } 
        }
    This should be all you'll have to do. If you want to edit the toolbar make it visible while you are editing it and afterwards hide it again.

    仅供参考,以我的Xcode,IOS版本,属性似乎被命名为toolbarHidden**isT**oolbarHidden


    另一种方法中(2016年9月17日)
    再回到步骤(或两个),I N注意到Table View Controller的一个选项,并试图利用它,但它似乎没有工作。有关详细信息,请参见图像(和内文):
      embed


    当我运行的应用程序,它似乎并没有什么差别(同样,见图片):
      embed


    我做什么错误?或者完全误解了Xcode接口?

    回答

    2

    将工具栏添加到任何视图的最简单方法之一是将其嵌入到NavigationViewController中。这一切都可以不用代码来完成:

    1. 以你目前拥有的视图控制器(我假定UITableViewController)和下编辑器 - >嵌入在选择导航控制器enter image description here

      1. 选择新创建的导航控制器。在Bar可见性下的实用工具栏中,选择工具栏即可显示。如果需要,您还可以保留导航栏,否则将其关闭。 enter image description here

      2. 现在您可以修改工具栏UITableViewController。只需将不同的工具栏项目(栏按钮项目,固定空间栏按钮项目,灵活栏按钮项目)拖动到工具栏上即可。请注意,您无法移动工具栏,只能在NavigationViewController中更改其样式。 enter image description here

    编辑: 既然你有不同的初始视图控制器,我建议你解决问题略有不同。这将需要的代码一点点:在UINavigationController

    1. 嵌入初始视图控制器(带有的按钮)。移除任何其他导航控制器。你的按钮应该只是简单的显示UITableViewController。禁用导航控制器中的工具栏,和以前一样,由您来启用导航栏(我会推荐它)。 enter image description here

    2. 如果尚未创建,请创建UITableViewController类并将其链接到您的Table View Controller。 enter image description here

    3. 这个代码添加到类,以便让工具栏出现和消失,当你正在查看的表视图:

      import UIKit 
      
      class ViewController: UITableViewController { 
      
          override func viewDidLoad() { 
           super.viewDidLoad() 
           navigationController?.isToolbarHidden = false 
          } 
      
          override func viewWillDisappear(_ animated: Bool) { 
           navigationController?.isToolbarHidden = true 
          } 
      
      } 
      

    这应该是所有你需要做的。如果要编辑工具栏,请在编辑时使其可见,然后再将其隐藏。

    +0

    我希望这有助于!不要犹豫,问我进一步的信息:) – Christoph

    +0

    我喜欢它 - 但我想我失去了一些东西,因为它失败了。这可能是我的错,因为没有提供更全面的图片。我有一个初始的'ViewController',它目前有3个按钮。每个按钮都是'UITableViewController'的缩写,每个按钮都有一个不同的'标识符' - 它最终会被我的代码使用。 随着我根据您的建议所做的更改,segue失败,并显示错误消息:“无法将'UINavigationController'类型的值(0x109452860)转换为'gj3.ExistingLocationsViewController'(0x107ac19e8)”。 –

    +0

    我也考虑过使用一个标准的视图并为它添加一个导航栏和表格视图(假设表格视图仍然会在其区域内滚动) - 但之后我不确定如何修改我的代码,因为视图不会基于'UITableViewController',我不确定我是否可以使用自定义的'UITableVIewController'类来应用Table View。 一般来说,我更喜欢你的想法,因为它*应该*(我相信)对我的代码意味着更少的更改 - 但我必须弄清楚如何解决这个问题 –

    1

    解析度(感谢克里斯托夫!)

    1. 前期工作

      • 我的工作一开始的单页的应用程序,包括默认UIViewController的( ViewController.swift)。
      • 我添加按钮的视图(和调整它们的外观和等)
      • 我加了一个UITableViewController,并创建了自己的自定义类为它(MyTableViewController.swift
      • 在表格的原型细胞我添加了几个标签来填充数据,并创建了我自己的单元格自定义类()
      • 然后我创建了从最初的UIViewControllerUITableViewController中的表中的按钮
        • 每个赛格瑞具有独特Identifier这将在以后使用,但现在它是允许的ID从最初的观点传递给表视图

          在这一点上,该应用程序“工作”,但我希望有一些按钮(无论是在表的顶部还是底部)来处理表中所选的任何数据。当我开始这个线程时,我添加了一个工具栏,但它基本上固定在原型单元格的下面,当有更多的数据行可以放在单个屏幕上时,它也被滚动并直到该列表一直滚动到最后。
    2. 修复 - 又名克里斯托夫来救援

      • 开始通过嵌入导航控制器
        • 初始视图我最初感到困惑的是什么被嵌入到了什么中,希望这张照片能让我变得更加美好牛逼更清晰
      • 这样做的结果,修改了故​​事板正是如此:
      • 我后来去我的表视图控制器场景和插入导航项目成现在出现在该视图顶部的空间:
      • 对此,我能够加入栏按钮项目 S:
      • 并配有多种自定义代码(更多关于这下面)能够得到这样的:
    3. 代码

    • 此时,对于`ViewController.swift`代码相对简单:
    import UIKit 
    
    class ViewController: UIViewController { 
    
        @IBOutlet weak var b1: UIButton! 
        @IBOutlet weak var b2: UIButton! 
        @IBOutlet weak var b3: UIButton! 
        var buttonId: String = "" 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
         // Do any additional setup after loading the view, typically from a nib. 
         b1.titleLabel?.adjustsFontSizeToFitWidth = true 
         b2.titleLabel?.adjustsFontSizeToFitWidth = true 
         b3.titleLabel?.adjustsFontSizeToFitWidth = true 
        } 
    
        override func didReceiveMemoryWarning() { 
         super.didReceiveMemoryWarning() 
         // Dispose of any resources that can be recreated. 
        } 
    
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
         let destination  = segue.destinationViewController as! MyTableViewController 
         destination.buttonId = segue.identifier 
        } 
    } 
    
    • 用于`MyTableViewCell.swift`也相当简单(至少现在)的代码:
    import UIKit 
    
    class MyTableViewCell: UITableViewCell { 
        @IBOutlet weak var l1: UILabel! 
        @IBOutlet weak var l2: UILabel! 
    
        override func awakeFromNib() { 
         super.awakeFromNib() 
    
         // Add bordering to bottom of each cell 
         let border = CALayer() 
         let width = CGFloat(1.0) 
         border.borderColor = UIColor.darkGrayColor().CGColor 
         border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
         border.borderWidth = width 
         self.layer.addSublayer(border) 
        } 
    
        override func setSelected(selected: Bool, animated: Bool) { 
         super.setSelected(selected, animated: animated) 
        } 
    } 
    
    • 为`代码MyTableViewController.swift`是,在另一方面,更复杂的 - 也许是因为有更多的只是它:
    import UIKit 
    
    class MyTableViewController: UITableViewController { 
        @IBOutlet weak var b1: UIBarButtonItem! 
        @IBOutlet weak var b2: UIBarButtonItem! 
        var buttonId: String! 
        var oldRow = -1 
        // The data below is clearly just for testing, eventually this should be pulled from file or DB 
        var locationList: [LocationObject] = [ 
         LocationObject(name: "name-01", address: "addr-1", selected: false), 
         LocationObject(name: "name-02", address: "addr-2", selected: false), 
         LocationObject(name: "name-03", address: "addr-3", selected: false), 
         LocationObject(name: "name-04", address: "addr-3", selected: false), 
         LocationObject(name: "name-05", address: "addr-3", selected: false), 
         LocationObject(name: "name-06", address: "addr-3", selected: false), 
         LocationObject(name: "name-07", address: "addr-3", selected: false), 
         LocationObject(name: "name-08", address: "addr-3", selected: false), 
         LocationObject(name: "name-09", address: "addr-3", selected: false), 
         LocationObject(name: "name-10", address: "addr-3", selected: false), 
         LocationObject(name: "name-11", address: "addr-1", selected: false), 
         LocationObject(name: "name-12", address: "addr-2", selected: false), 
         LocationObject(name: "name-13", address: "addr-3", selected: false), 
         LocationObject(name: "name-14", address: "addr-3", selected: false), 
         LocationObject(name: "name-15", address: "addr-3", selected: false), 
         LocationObject(name: "name-16", address: "addr-3", selected: false), 
         LocationObject(name: "name-17", address: "addr-3", selected: false), 
         LocationObject(name: "name-18", address: "addr-3", selected: false), 
         LocationObject(name: "name-19", address: "addr-3", selected: false), 
         LocationObject(name: "name-10", address: "addr-3", selected: false), 
         ] 
    
        // This embedded class is to support the above data. It may get replaced in final code 
        class LocationObject { 
         var name:  String! 
         var address: String! 
         var selected: Bool! 
    
         init(name: String, address: String, selected: Bool) { 
          self.name  = name 
          self.address = address 
          self.selected = false 
         } 
        } 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
         // code to hide/expose the navbar (top) and toolbar(bottom) when the view loads 
         navigationController?.navigationBarHidden = false 
         navigationController?.toolbarHidden  = true 
        } 
    
        // code to hide the navbar and toolbar when this view goes away 
        override func viewWillDisappear(animated: Bool) { 
         navigationController?.navigationBarHidden = true 
         navigationController?.toolbarHidden  = true 
        } 
    
        override func didReceiveMemoryWarning() { 
         super.didReceiveMemoryWarning() 
        } 
    
        override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
         return 1 
        } 
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
         return locationList.count 
        } 
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
         let cell = tableView.dequeueReusableCellWithIdentifier("resultCell", forIndexPath: indexPath) as! MyTableViewCell 
         let row = indexPath.row 
         let item = locationList[row] 
    
         cell.l1.text = item.name 
         cell.l2.text = item.address 
    
         return cell 
        } 
    
        override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 
         let cell     = tableView.cellForRowAtIndexPath(indexPath) as! MyTableViewCell 
         let row     = indexPath.row 
         cell.accessoryType   = .None 
         locationList[row].selected = false 
        } 
    
        override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
         b1.enabled = true 
         let cell     = tableView.cellForRowAtIndexPath(indexPath) as! MyTableViewCell 
         let row     = indexPath.row 
         locationList[row].selected = !locationList[row].selected 
         cell.accessoryType   = (locationList[row].selected == true) ? .Checkmark : .None 
         cell.highlighted   = false 
         cell.setHighlighted(false, animated: true) 
    
         // TOGGLE SELECTION 
         if oldRow == row { 
          b1.enabled = false 
          let oldIndexPath = NSIndexPath(forRow: oldRow, inSection: 0) 
          tableView.deselectRowAtIndexPath(oldIndexPath, animated: true) 
          oldRow = -1 
         } 
         else { 
          oldRow = row 
         } 
        } 
    } 
    

    而且,简而言之就是它。我仍然处于开发我的应用程序的初期阶段 - 不知何故,我确信我会在我前进的过程中发布更多关于实现的问题,但希望以上内容能够帮助其他人可能会遇到同样的问题,或类似的问题。

    再次感谢Christoph提供了关于将视图嵌入导航视图控制器等方面的非常需要的方向。

    相关问题