Использование 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 к представлению контроллеров представления.

Другие вопросы по тегам