Использование UITableView подробно, как отобразить строку в TextView (проект Master-Detail, Swift, iOS)
Я хочу использовать TableView для детализации приложения Master Detail. Я начал со стандартного проекта Master Detail в XCode, удалил стандартное приложение, которое идет с ним, удалил стандартный контроллер деталей UIView, добавил контроллер TableView, добавил TextView в ячейку прототипа для тестирования и создал новый переход к новый TableView. Я создал подкласс UITableViewCell и создал выход (detailTextView) из TextView в подкласс (TableViewCell). Изменен класс в DetailViewController.swift с UIViewController на UITableViewController. Я успешно передаю строку stringForTextView = "String for TextView"
от мастера до мелочей. Но я не могу понять, как отобразить эту строку в TextView. Я пытался ссылаться на текст TextView в подробном представлении через розетку (detailTextView.text
) но получил "Use of unresolved identifier detailTextView"
Любая помощь будет оценена.
Соответствующий код показан ниже.
Вы также можете скачать весь проект здесь, если это будет полезно: http://greendept.com/MasterDetailTwoTableViews/
TableViewCell.swift (подкласс для прототипа ячейки подробно)
import UIKit
class TableViewCell: UITableViewCell {
@IBOutlet weak var detailTextView: UITextView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
DetailViewController.swift
import UIKit
class DetailViewController: UITableViewController {
var stringForTextView : String?
var detailItem: AnyObject? {
didSet {
// Update the view.
self.configureView()
}
}
func configureView() {
// THE NEXT TWO LINES WORK: PASSED IN STRING PRINTS TO CONSOLE
let printThis = stringForTextView! as String
print("\(printThis)")
// BUT THE REFERENCE TO THE OUTLET BELOW DOES NOT WORK, GIVES
// "Use of unresolved identifier detailTextView"
detailTextView.text = printThis
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.configureView()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
MasterViewController.swift
import UIKit
class MasterViewController: UITableViewController {
var detailViewController: DetailViewController? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let split = self.splitViewController {
let controllers = split.viewControllers
self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
}
}
override func viewWillAppear(animated: Bool) {
self.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed
super.viewWillAppear(animated)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Segues
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.stringForTextView = "String for TextView"
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
// MARK: - Table View
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
}
2 ответа
Эта ссылка ниже показывает, как вы можете изменить текст в метке ячейки, даже если выход для текстового представления находится в подклассе ячейки. Это показывает это с одним TableView.
создание пользовательских ячеек таблицы в Swift
Приспосабливая вышеупомянутый подход для моего тестового проекта, мне не пришлось менять Мастера вообще. В подробном представлении configureView()
не выполняет основную работу по обновлению TextView. Что происходит в cellForRowAtIndexPath
- вторая до последней функции в подробном представлении. Другое отличие - я не мог и не нуждался в реализации @IBOutlet var tableView: UITableView!
- потому что tableView уже был доступен как сохраненное свойство. Я также должен был добавить overrride
в нескольких местах. Наконец, в классе TableViewCell я добавил выпуск, связанный с представлением содержимого TextView. В результате текст TextView обновляется.
TableViewCell.swift:
import UIKit
class TableViewCell: UITableViewCell {
@IBOutlet weak var detailTextView: UITextView!
@IBOutlet weak var detailContentView: UIView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
print ("awakeFromNib")
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
print("test")
}
}
DetailViewController.swift:
import UIKit
class DetailViewController: UITableViewController {
// @IBOutlet var tableView: UITableView! -- cannot override a stored property
var stringForTextView : String?
// Don't forget to enter this in IB also
let cellReuseIdentifier = "reuseIdentifier"
var detailItem: AnyObject? {
didSet {
// Update the view.
self.configureView()
}
}
func configureView() {
// Update the user interface for the detail item.
// stringForTextView
let printThis = stringForTextView! as String
print("\(printThis)")
// detailTextView.text = printThis
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
self.configureView()
}
// needed "override" here
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
// create a cell for each table view row
// needed "override" here
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as! TableViewCell
cell.detailTextView.text = stringForTextView
print("cell.detailTextView.text: \(cell.detailTextView.text)")
print("row : \(indexPath.row)")
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
DetailViewController
это UITableViewController
и вы не можете получить доступ к detailTextView
в контроллере tableView. Вы определили выход в ячейке, и именно здесь вы можете получить доступ и настроить detailTextView
,
Нет смысла иметь DetailViewController
как UITableViewController
, если вы действительно хотите настроить текстовое представление там. Затем вы должны установить его обратно в UIViewController
и добавьте текстовое представление как один UITextView
к представлению контроллеров представления.