2015-08-06 3 views
2

В настоящее время я делаю приложение с быстрым доступом, которое содержит информацию об автомобилях. Я использую UITableView для марок, моделей, лет.Как подключить UITableView к другому UITableView

То, что я хочу знать, могу ли я иметь UITableView связан с другим UITableView в зависимости от пользовательского ввода, например:

Tableview 1 (делает)

  • Audi
  • Honda

Таблица 2 (Модели)

  • Audi -> A1, A2, A3 ........
  • Honda -> Civic, Jazz ...

TableView 3 (лет)

  • Audi - > A3 -> 2005,2006,2007 .....
  • Honda -> Civic -> 2005,2006,2007 .....

Код для Tableview 1

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.Makes = [Make(name: "Audi"),Make(name: "Nissan"),Make(name: "Fiat"),Make(name: "Ford"),Make(name: "Honda"),Make(name: "Mercedes-Benz"),Make(name: "Lexus"),Make(name: "BMW"),Make(name: "Vauxhall"),Make(name: "VW")] 
} 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.Makes.count 

} 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 
    var make = Makes[indexPath.row] 
    cell.textLabel?.text = make.name 
    return cell 
} 
+1

Я не понимаю? Почему бы вам не организовать данные, FirsTableView for Makes, SecondTableView для моделей на основе ячейки, выбранных для пользователя в первом SecondTableView, и третий для Year, основанный на модели, выбранной в SecondTableView? –

ответ

0

Этот подход бурения вниз, чтобы увидеть больше деталей является очень распространенным явлением, и Xcode даже предоставляет шаблон для иллюстрации этого, называемый Master-Detail.

Как это работает, когда вы выбираете строку в первом (или главном) tableView, она выполняет команду showDetail во второй (или подробно) tableViewController.

В prepareForSegue вы получите индексную строку выбранной строки и передаете make в контроллер детали (назначения). Тогда этот контроллер просмотра покажет все модели для этого автомобиля.

Вы должны использовать тот же процесс в таблице detailView, чтобы передать конкретную модель третьему TableViewController, чтобы увидеть все годы для этой модели и модели.

override func prepareForSegue(segue: UIStoryboardSegue, 
      sender: AnyObject?) { 

    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow() { 
      Let make = Makes[indexPath.row] 

      let controller = (segue.destinationViewController 
    as UINavigationController).topViewController 
     as! DetailViewController 

      controller.detailItem = make 
      controller.navigationItem.leftBarButtonItem = 
    splitViewController?.displayModeButtonItem() 
      controller.navigationItem.leftItemsSupplementBackButton = true 
     } 
    } 
} 

Update:

Мастер-Detail шаблон обеспечивает другие преимущества, такие как адаптивный интерфейс. Например, на iPad или iPhone 6 Plus пользователь может выбрать просмотр основных и подробных представлений в режиме разделения.

+0

Благодарим вас за это завтра – Alexh

+0

@Alexh Вы можете проверить [это бесплатное приложение] (https://itunes.apple.com/us/app/messiah-bible-prophecies-about/id951349672?mt=8&at = 1010l3f4), чтобы понять, как можно управлять 3 уровнями информации. Если это работает так, как вы хотите, вы можете найти [исходный код на GitHub] (https://github.com/PetahChristian/TheMessiah). Он использует segues для связывания трех табличных экранов, как я объяснил. Дайте знать, если у вас появятся вопросы! –

+0

Хорошо спасибо будет играть с приложением на некоторое время – Alexh

1

1.- Организуйте свои данные в хорошей манере, возможно, в виде графика, дерева или просто списков, связанных со всеми вашими данными.

2.- Для простоты выполняет функции, которые дадут вам соответствующие данные для каждого вида таблицы. Позволяет сказать:

func getModels(make: Makes) -> [Model] 
func getYears(model: Model) -> [Years] 

или просто

func getModels(make: String) -> [String] 
func getYears(model: String) -> [String] 

также некоторые вспомогательные функции, которые позволяют реализовать любую структуру данных позади, так же, как, например:

func getMaker(int:Int) -> Maker? или func getMaker(int: Int) -> String?

3.- Вы должны сохранить в памяти, какие из ваших возможных производителей и моделей были выбраны, на данный момент, :

var selectedMaker: String? 
var selectedModel: String? 

4.- Я предполагаю, что вы будете иметь все ваши UITableViews в том же UIViewController или UITableViewController, так что вам нужно будет решить, соответствующие данные, чтобы показать каждый. Для этого вам нужно будет различать каждый из них, как показать, с тегами, равенством экземпляра и т. Д. Я предлагаю для более поздней читаемости и возможности использования в конечном итоге иметь функцию, которая вернет число? возможно, соответствует таблице. За это объяснение, позвольте называть его func whichTableIsThis(tableView: UITableView) -> Int?

5.- Ваши делегаты должны работать по-разному для каждого из этих таблиц. Здесь мы будем использовать нашу новую функцию, которая должна возвращать 1, 2 или 3 .., если этот табличный вид не является одним из них. :)

extension YourViewControlerWithTableViews: UITableViewDelegate, UITableViewDataSource { 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    //I'm assuming you will have only one cell, lets call it `AttributesTableViewCell` 
    var cell = tableView.dequeueReusableCellWithIdentifier("yourCellName", forIndexPath: indexPath) as! AttributesTableViewCell 
    cell.attributeValue.text = "" 
    if let tableNumber = whichTableIsThis(tableView) { 
    //here you will be checking for every of your tree cases, for this example I will check just for Models 
     //OK, so tableNumber returned 2 
    if tableNumber == 2 && selectedMaker != nil{ 
     let value = getModels(selectedMaker!)[indexPath.row] 
     cell.attributeValue.text = value 
     } 
     //... 
    } 
    return cell 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let tableNumber = whichTableIsThis(tableView) { 
     //here you will be checking for every of your tree cases, for this example I will check just for Models 
     //OK, so tableNumber returned 2 
     if tableNumber == 2 && selectedMaker != nil{ 
     return getModels(selectedMaker!).count 
     } 
     //... 
    } 
    return 0 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    if let tableNumber = whichTableIsThis(tableView) { 
     //here you will be checking for every of your tree cases, for this example I will check just for Maker 
     //OK, so tableNumber returned 1 
     if tableNumber == 1 { 
     selectedMaker = getMaker(indexPath.row) 
     //Here you must refresh data for your next tables in hierarchy, to allow them to refresh with new data 
     selectedModel = nil 
     selectedYear = nil 
     tableview2.reloadData() 
     tableview3.reloadData() 
     } 
     //... 
    } 
} 
} 

И .. Это должно быть все. Надеюсь, поможет!

+0

Большое спасибо за обновление завтра после ввода кода – Alexh

+0

@Alexh Проблема с пунктом 4 (перезагрузка таблицыView вместо того, чтобы нажимать контроллер подробного представления на стек контроллера навигации) заключается в том, что нет интуитивного способа вернуться к предыдущему уровню. Придерживайтесь привычного, ожидаемого поведения push/pop, которое все пользователи узнают. –

+0

@PetahChristian приложений может быть много и с творческой точки зрения, бесконечно. Alexh не указывает, для какой-то игры, или если это общее/коммерческое приложение. Как вы заявляете о точке 4, я согласен с тем, что если единственная цель представления - показать эти данные, то мозг пользователя легче будет искать один шаг в то время. Но опять же, все это зависит от намерений дизайнера приложения. Пользователь всегда может выбрать другой ** Maker **, и все данные будут обновлены. –

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