如何在ViewController中的XIB(NIB)实例化uiview / uitaiteView



我想显示一个具有分段控件的用户界面,并且为分段控件的每个部分提供了不同的表视图;因此,可以在两者之间切换的2个桌子视图(伙伴和束)。为了实现这一点,我完成了以下

  1. 在故事板上创建一个ViewController
  2. 从ViewController删除视图
  3. 使用关联的XIB文件创建一个新的UiviewController Swift类
  4. 将分段的控件放在xib
  5. 中的主Uiview中
  6. 将一个内部Uiview元素放在主Uiview的内部,以获取表替换的空间
  7. 创建了UaiteView和相应XIB文件的两个子类

我想到的一些选项:

  • 我可以将接口构建器中的内部Uiview的类设置为一个表视图之一,但是我不知道如何实例化另一个视图。如果我创建了重叠的内部Uiviews,每个Uiviews都与表视图关联并在切换分段控件时隐藏其中的一个,那实际上是有效的,但是视图的重叠性质使布局变得困难且不直觉。
  • 我想知道如何做:实例化表代替单个主Uiview元素
  • 替代方案:具有一个基于其显示的数据的分段控制状态的条件,该子类具有一个条件。我不太喜欢这样,因为它会将代码与表视图混合在一起。在这种情况下,我什至不需要再使用XIB,只需一个桌子视图就可以在故事板上做到这一点。

** ViewController代码**

@objc(BuddiesBunchesViewController) class BuddiesBunchesViewController: UIViewController {
    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var tableView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        // Instantiate tableView here to BuddiesTableView
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    @IBAction func segmentedControlIndexChanged(sender: AnyObject) {
        switch segmentedControl.selectedSegmentIndex {
        case 0: // Buddies
            // Set tableview to the buddies table view
        case 1: // Bunches
            // Set tableview to the buddies table view
        default:
            break;
        }
    }
}

**表查看**

@IBDesignable class BuddiesTableView: UITableView, UITableViewDataSource, UITableViewDelegate {
    var view: UIView!
    var nibName: String = "BuddiesTableView"
    //init
    override init(frame: CGRect) {
        // set properties
        super.init(frame: frame)
        // Set anything that uses the view or visible bounds
        setup()
    }
    required init(coder aDecoder: NSCoder) {
        //set properties
        super.init(coder: aDecoder)
        // Setup
        setup()
    }
    func setup() {
        view = loadViewFromNib()
        view.frame = self.bounds
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
         addSubview(view)
    }
    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        return view
    }
// MARK: - Table View
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return 10
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")
        cell.textLabel?.text = "(indexPath.row)"
        return cell
    }
}

我个人不会创建两个表视图并将它们交换。两者之间唯一的重要区别是它们是不同的实例,您可以在数据源代码中对其进行测试。他们会指出不同的数据源吗?为什么不只是在即时更改数据源,而不是表视图呢?

创建一个表观。创建两个(或更多)类,以充当数据源(甚至可能是代表)。如果有任何共同的行为,它们可能基于共同的超类。

当分段的控制值更改时,只需更改表视图的数据源属性,以指向该状态的代码的类。如果更改数据源不会自动重新加载,则可能需要使用-reloaddata调用来遵循。

@IBOutlet private weak var tableView: UITableView!
let moviesDataSource = MyMoviesDataSource()
let tvShowsDataSource = MyTVShowsDataSource()
@IBAction func segmentedControlTouched(sender: UISegmentedControl) {
    switch sender.selectedSegmentIndex {
    case 0:
        self.tableView.dataSource = self.moviesDataSource
        self.tableView.delegate = self.moviesDataSource
    case 1:
        self.tableView.dataSource = self.tvShowsDataSource
        self.tableView.delegate = self.tvShowsDataSource
    }
    self.tableView.reloadData()
}

我的解决方案将如下。

您有一个段控件,有两个段,因此,您只能拥有一个UITableView对象,而不是具有两个表视图,并基于段控制selectedSegmentIndex数字更改数据源,然后重新加载表视图。在故事板中,将表视图放在UIVIewController的顶部,并为此创建@IBOutlet

最新更新