如何从ViewController中的xib(nib)实例化UIView / UITableView

时间:2015-05-06 18:08:38

标签: ios uitableview swift uiview xib

我想显示一个具有分段控件的用户界面,以及分段控件的每个部分的不同表视图;所以,可以在两者之间切换的2个表视图(好友和串)。 为实现这一点,我做了以下

  1. 在Storyboard中创建一个ViewController
  2. 从ViewController中删除视图
  3. 使用关联的xib文件创建一个新的UIViewController swift类
  4. 将分段控件放在xib中的主UIView中
  5. 将一个内部UIView元素放在主UIView中,以获取表格查看替换它的空间
  6. 创建了两个UITableView子类和相应的xib文件
  7. 我想到的一些选项:

    • 我可以将Interface Builder中内部UIView的类设置为其中一个表视图的类,但我不知道如何实例化另一个代替初始视图。如果我创建了重叠的内部UIViews,每个UIViews都与一个表视图相关联,并在我切换分段控件时隐藏其中一个,这实际上是有效的,但是视图的重叠性使得布局变得困难和不直观。
    • 我想知道怎么做:实例化表格视图代替单个主要UIView元素
    • 替代方法:让一个UITableView子类具有基于分段控件状态的条件,以显示它所显示的数据。我不喜欢这样,因为它会将代码混合在一起用于表格视图。在这种情况下,我甚至不需要再使用xib了,我可以在故事板中只用一个表视图来做这个。

    ** ViewController代码**

    t = 0:20
    y1 = nan(size(t));
    for ii = 1:length(t)
        y1(ii) = 2*t(ii)*x + 2*b1 + b2;
    end
    

    **表格视图**

    @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;
            }
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我的解决方案如下。

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

答案 1 :(得分:0)

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

创建一个表视图。创建两个(或更多)类作为数据源(可能还有委托)。如果存在任何共同的行为,它们可以基于共同的超类。

当分段控制值发生变化时,只需将表视图的dataSource属性更改为指向具有该状态代码的类。如果更改数据源并未自动重新加载,您可能还需要使用-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()
}