2015-05-06 6 views
0

Я хочу отобразить пользовательский интерфейс, который имеет сегментированный элемент управления, и другое табличное представление для каждого раздела сегментированного элемента управления; так, 2 вида таблицы (приятели и сгустки), которые могут переключаться между ними. Для реализации этого, я сделал следующийКак создать экземпляр UIView/UITableView из xib (nib) в ViewController

  1. Создать ViewController в раскадровке
  2. Удалить Вид из ViewController
  3. Создать новый UIViewController быстрого класс с ассоциированным XIb файлом
  4. Помещенный сегментированного управление в главном UIView в xib
  5. Поместите внутренний элемент UIView внутри основного UIView, чтобы взять место, где видны таблицы, где его заменить
  6. Создано два подкласса UITableView и соответствующие XIB файлы

Некоторые опции я думал о:

  • я могу установить класс внутренней UIView в Interface Builder быть у одного из представлений таблицы, но я не знаю, как создать экземпляр другого вместо первоначального. Если бы я создал перекрывающиеся внутренние UIViews, каждый из которых был связан с представлением таблицы и спрятал один из них при переключении сегментированного элемента управления, это фактически работает, но перекрывающийся характер просмотров делает компоновку сложной и неинтуитивной.
  • То, что я хочу знать, как сделать: Инстанцировать взгляды таблицы вместо одного основного UIView элемента
  • Альтернатива: Есть один UITableView подкласса, который имеет состояние на основе состояния сегментированного контроля за какие данные он отображает. Мне это не нравится, потому что он будет смешивать код для табличных представлений. В этом случае мне больше не понадобилось бы использовать xibs, я мог бы сделать это в раскадровке только с одним табличным представлением.

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

** Table View **

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

ответ

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() 
} 
+0

К сожалению. @ Amit89 избил меня. –

+0

Хорошо, я никогда не думал о том, чтобы вытащить datasource tableview и делегировать отдельные классы. Итак, после изменения управления сегментом, как бы я поменял эти классы? Не могли бы вы предоставить небольшой код? – hoffware

+0

Я добавил код к своему ответу. –

0

Мое решение будет, как показано ниже.

У вас есть сегментный контроль, имеющий два сегмента, поэтому вместо двух видов таблиц вы можете иметь только один объект UITableView и изменить источник данных на основе номера сегмента selectedSegmentIndex и после этого перезагрузить представление таблицы. В раскадровке положите стол вверху UIVIewController и создайте для этого @IBOutlet.

+0

Что делать, если для двух видов таблиц требуются разные типы пользовательских ячеек? Один из видов таблиц требует заголовков, а другой нет, поэтому я не думаю, что это решение разрешит эти случаи, не так ли? – hoffware

+0

В представлении таблицы, которое находится поверх UIViewController, создайте две разные ячейки прототипа и создайте два подкласса UITableViewCell для каждой из ячеек и используйте требуемую ячейку на основе элемента управления сегмента. Для заголовка, для заголовка и пользовательского заголовка мы имеем методы делегирования, там проверяем, для какого сегмента вам нужны данные заголовка, а для другого - пустая строка «" для заголовка и nil для заголовка. – Amit89

Смежные вопросы