2014-11-09 4 views
2

Я пытаюсь установить tableView как subview в моем viewController. Но без использования раскадровки! Я пытаюсь этот код, но это не похоже на работу, и я не могу понять, почему .. Так что это код, в котором должен быть создан TableView:Использование UITableView без раскадровки

func TableView(position: CGRect, allRecipes: [Recipe]) -> UITableView { 
    let tableView: UITableView = UITableViewForAllRecipes(style: UITableViewStyle.Plain).tableView 


    return tableView; 
} 

.

и это мой tableviewcontroller (UITableViewForAllRecipes)

class UITableViewForAllRecipes: UITableViewController { 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 

    cell.textLabel.text = "ok" 

    return cell 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    println("nosit") 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    println("tv") 
    return 3 
} 

}

Кто-нибудь увидеть, что я делаю неправильно? Поскольку он даже не печатает эти «nosit» и «tv», поэтому он не доходит до этого кода. Я тоже ничего не получил от отладки.

+0

После возвращения 'TableView' функции, то' UITableViewForAllRecipes' вид контроллер будет освобождаться. –

+0

@Swipesight Когда я перемещаю код так, чтобы tableview был непосредственно добавлен как подзаголовок моего viewController, он по-прежнему пуст и не достигает println-кода в моем контроллере –

+0

В принципе, вы не должны создавать табличный вид, подобный этому, возврат таблицы из функции «TableView» будет иметь источник данных, а делегат - на контроллер вида, который освобождается. –

ответ

0

@Swipesight является правильным. Причина, почему вы видите пустой TableView:

  • Вы создаете экземпляр UITableViewForAllRecipes, контроллер TableView держит TableView и себя в качестве источника данных, Tableview и делегата.
  • Затем вы захватываете табличное представление, добавляете его как подвью, но поскольку tableview держит его делегат в качестве слабой ссылки, когда вы выходите из функции TableView(), сам редактор tableviewcontroller освобождается, так как не более сильный ref.
  • Когда визуализируется табличное представление, он запрашивает свой источник данных, который равен нулю, и вы получаете пустой вид в таблице.

Возможные исправления:

Держите сильный реф к вашему tableviewcontroller в контроллере представления родительского

например

func TableViewController(position: CGRect, allRecipes: [Recipe]) -> UITableViewForAllRecipes { 
    return UITableViewForAllRecipes(style: UITableViewStyle.Plain) 
} 

добавить свойство в вашем родительском контроллере представления

var tableViewController: UITableViewForAllRecipes? 

Затем в функции, где вы звоните TableView

self.tableViewController = self.TableViewController(xxxx) 
self.view.addSubview(self.tableViewController!.tableView) 
+0

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

+0

Отличный !! работает с этим, спасибо! –

+0

@Shuo Когда вы добавляете представление ребенка, вам необходимо обеспечить, чтобы события продолжали распространяться на оба контроллера представления. Вы делаете это, явно связывая новый контроллер представления как дочерний элемент контейнера. - Извлечение из «Руководства по программированию на просмотр контроллера для iOS» от Apple –

1

Как реализовать контроллер представления, которое имеет вид таблицы добавляется к его виду иерархии зависит от того, требуется ли отдельный контроллер представления для управления представлением в виде таблицы.

Если вам требуется отдельный контроллер представления, то

class UITableViewForAllRecipes: UITableViewController { 

     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
       var cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 

       cell.textLabel.text = "ok" 

       return cell 
     } 

     override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
       println("nosit") 
       return 1 
     } 

     override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
       println("tv") 
       return 3 
     } 
} 

class ViewController: UIViewController { 
     let childTableViewController = UITableViewForAllRecipes(style: .Plain) 
     let otherView = UIView() 

     override func viewDidLoad() { 
       super.viewDidLoad() 

       // TODO: setup otherView's frame, autoresizingMask ... 

       view.addSubview(otherView) 

       addChildViewController(childTableViewController) 

       let tableView = childTableViewController.tableView 

       // TODO: setup tableView's frame, autoresizingMask ... 

       view.addSubview(tableView) 

       childTableViewController.didMoveToParentViewController(self) 
     } 
} 

иначе

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
     let tableView = UITableView() 
     let otherView = UIView() 

     override func viewDidLoad() { 
       super.viewDidLoad() 

       // TODO: setup otherView's frame, autoresizingMask ... 

       view.addSubview(otherView) 

       // TODO: setup tableView's frame, autoresizingMask ... 

       tableView.dataSource = self 
       tableView.delegate = self 

       view.addSubview(tableView) 
     } 

     // MARK: - UITableViewControllerDataSource 

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
       var cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 

       cell.textLabel.text = "ok" 

       return cell 
     } 

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

     func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
       println("tv") 
       return 3 
     } 
} 
Смежные вопросы