2016-07-18 3 views
0

Master Detailアプリケーションの詳細側にTableViewを使用したいと思います。私はXcodeの標準的なマスターディテールプロジェクトから始め、それに付属の標準アプリケーションを削除し、標準のUIViewディテールコントローラーを削除し、TableViewコントローラーを追加して、テスト用のプロトタイプセルにTextViewを追加し、新しいTableView。私はUITableViewCellをサブクラス化し、TextViewからコンセント(detailTextView)をサブクラス(TableViewCell)に作成しました。 DetailViewController.swiftのクラスをUIViewControllerからUITableViewControllerに変更しました。私は正常に文字列stringForTextView = "String for TextView"をマスターから詳細に渡しています。しかし、私はTextViewにその文字列を表示する方法を理解できません。テキストビューのテキストをコンセント(detailTextView.text)を介して詳細ビューで参照しようとしましたが、得られた文字は"Use of unresolved identifier detailTextView"です。詳細を使用して、TextView(Master-Detailプロジェクト、Swift、iOS)で文字列を表示する方法

ご協力いただけると助かります。

関連コードを以下に示します。

それが参考になる場合にも、ここでプロジェクト全体をダウンロードすることができます。 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 
    } 
} 
+0

詳細をテーブルビューとして設定したのはなぜですか?テキストビュー、テキストフィールド、またはラベルを持つ標準のUIViewControllerサブクラスは理にかなっています。テーブルビューを使用する場合は、セルを提供するためにすべてのtableviewデータソースメソッドを実装する必要があります – Paulw11

答えて

0

DetailViewControllerUITableViewControllerであり、tableViewコントローラのdetailTextViewにアクセスすることはできません。セルにコンセントを定義しました。ここにはdetailTextViewにアクセスして設定することができます。

DetailViewControllerUITableViewControllerとするのは意味がありません。本当に必要なのはそこにテキストビューを設定することです。次に、それをUIViewControllerに戻し、テキストビューを単一のUITextViewとしてビューコントローラビューに追加する必要があります。

+0

ありがとうございました。詳細ビューで最終的にやりたかったことは、UITableViewControllerでより簡単に/よりうまくいくと思いました。だから私はそれをやろうとしていた。 TextViewは、テスト/学習目的のスタートに過ぎませんでした。たぶん私はそれをもう少し周りに遊んで、私がセルで働きたいことができる方法があるかどうかを見てみましょう。 – user1147171

0

このリンクは、テキストビューのコンセントがセルのサブクラスにある場合でも、セルラベルのテキストを変更する方法を示しています。これは、単一のTableViewでこれを示しています。

creating custom tableview cells in swift

は私のテストプロジェクトのための上記のアプローチを適応させるには、私はすべてのマスターを変更する必要はありませんでした。詳細ビューでは、configureView()はTextViewを更新する主な仕事をしません。それはcellForRowAtIndexPath - 詳細ビューの最後の機能から2番目に発生します。もう1つの違いは、@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. 
    } 
} 
+0

http://stackoverflow.com/questions/26561461/outlets-cannot-be-connected-to-repeating-content-ios "テーブルビューのセルサブクラスを作成し、それをクラスとして設定するそのクラスにアウトレットを追加して接続してください。セルを設定すると、アウトレットにアクセスできます。 – user1147171

関連する問題