2016-07-18 1 views
0

Master Detail app의 세부면에 TableView를 사용하고 싶습니다. 나는 Xcode의 표준 Master Detail 프로젝트로 시작하여 함께 제공되는 표준 앱을 삭제하고, 표준 UIView 세부 컨트롤러를 삭제하고, TableView 컨트롤러를 추가하고, 테스트 용 프로토 타입 셀에 TextView를 추가하고, 새로운 Segue를 생성했습니다. 새로운 TableView. 나는 UITableViewCell을 하위 클래스 화하고 TextView에서 하위 클래스 (TableViewCell)로 콘센트 (detailTextView)를 만들었습니다. UIViewController에서 DetailViewController.swift의 클래스를 UITableViewController로 변경했습니다. 나는 성공적으로 문자열 stringForTextView = "String for TextView"을 마스터에서 상세로 전달하고있다. 하지만 TextView에서 해당 문자열을 표시하는 방법을 알아낼 수 없습니다. 자세히보기에서 TextView 텍스트를 콘센트 (detailTextView.text)를 통해 보려고했으나 "Use of unresolved identifier detailTextView"UITableView를 자세히 사용하여 TextView (Master-Detail 프로젝트, Swift, iOS)에서 문자열을 표시하는 방법

도움을 주시면 감사하겠습니다.

관련 코드는 아래에 나와 있습니다. 그 도움이 될 것입니다 경우

또한 여기에 전체 프로젝트를 다운로드 할 수 있습니다 http://greendept.com/MasterDetailTwoTableViews/

TableViewCell.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. 
    } 

} 

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

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

내 테스트 프로젝트에 대한 위의 접근 방식을 채택, 나는 모든 마스터를 변경하지 않았다. Detail 뷰에서 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. 
    } 
} 
+0

이 접근법은 여기에 잘 요약되어 있습니다 : http://stackoverflow.com/questions/26561461/outlets-cannot-be-connected-to-repeating-content-ios "표보기 셀 하위 클래스를 만들고이를 클래스로 설정하십시오 이 클래스에 아웃렛을 추가하고 연결하면 이제 셀을 구성 할 때 콘센트에 액세스 할 수 있습니다. " – user1147171

관련 문제