2017-10-28 17 views
1

Swift Playgrounds에서 간단한 노트 앱을 만들려고하고 있는데 막혔습니다.Swift Playgrounds의 간단한 노트 앱

스토어 보드가 없으므로 마스터보기 (UITableView)에서 상세보기 (UITextView)로 데이터를 보내고 그 반대의 경우는 prepareForSegue이 아닌데 어떻게 보낼 수 있습니까?

무엇이 잘못되었거나 잘못 되었습니까?

저는 솔루션을 찾기 위해 노력하고 있습니다. 따라서 도움을 주시면 대단히 감사하겠습니다. ,

import UIKit 
import PlaygroundSupport 

class MasterViewController: UITableViewController { 

    var noteData: [String] = [] 
    var selectedRow: Int = -1 
    var newRowLabel: String = "" 

    override func viewDidLoad() { 
     configureNavigationBar() 
     loadNote() 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     if selectedRow == -1 { 
      return 
     } 
     noteData[selectedRow] = newRowLabel 
     if newRowLabel == "" { 
      noteData.remove(at: selectedRow) 
     } 
     tableView.reloadData() 
     saveNote() 
    } 

    @objc func newNote() { 
     let noteTitle: String = "" 
     noteData.insert(noteTitle, at: 0) 
     let indexPath: IndexPath = IndexPath(row: 0, section: 0) 
     tableView.insertRows(at: [indexPath], with: .automatic) 
     tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none) 
     navigationController?.pushViewController(DetailViewController(), animated: true) 
    } 

    func configureNavigationBar() { 
     title = "Notes" 
     let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(newNote)) 
     navigationItem.rightBarButtonItem = addButton 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return noteData.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 
     if cell == nil { 
      cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") 
     } 
     cell?.textLabel?.text = noteData[indexPath.row] 
     return cell! 
    } 

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     noteData.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .fade) 
     saveNote() 
    } 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     navigationController?.pushViewController(DetailViewController(), animated: true) 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let detailView: DetailViewController = segue.destination as! DetailViewController 
     selectedRow = tableView.indexPathForSelectedRow!.row 
     detailView.masterView = self 
     detailView.setText(noteText: noteData[selectedRow]) 
    } 

    func saveNote() { 
     UserDefaults.standard.set(noteData, forKey: "Notes") 
     UserDefaults.standard.synchronize() 
    } 

    func loadNote() { 
     if let loadedNote = UserDefaults.standard.value(forKey: "notes") as? [String] { 
      noteData = loadedNote 
      tableView.reloadData() 
     } 
    } 
} 

class DetailViewController: UIViewController { 

    let textView = UITextView() 
    var noteText: String = "" 
    var masterView: MasterViewController! 

    override func loadView() { 
     configureDetailView() 
    } 

    override func viewDidLoad() { 
     configureTextView() 
    } 

    func configureDetailView() { 
     view = textView 
    } 

    func configureTextView() { 
     textView.text = noteText 
    } 

    func setText(noteText: String) { 
     if isViewLoaded { 
      textView.text = noteText 
     } 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     masterView?.newRowLabel = noteText 
    } 
} 

let masterViewController = MasterViewController() 
let navigationController = UINavigationController(rootViewController: masterViewController) 

PlaygroundPage.current.liveView = navigationController 

답변

2

당신의 didSelectRow 방법에있어서 :

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    navigationController?.pushViewController(DetailViewController(), animated: true) 
} 

당신이 만드는 당신의 DetailViewController()하지만보기 컨트롤러이 때 모든 데이터를 전달하지 변수를 사용하여 데이터를 수락하므로 수행하지 말고 수행하십시오.

navigationController?.pushViewController(DetailViewController(), animated: true) 

당신은 할 수 있습니다 :

let detailVC = DetailViewController() 
    detailVC.noteText = noteData[indexPath.row] 
    navigationController?.pushViewController(detailVC, animated: true) 

편집 : 솔루션이 일을하기 위해 많은 변화가 필요하기 때문에 나는 내가 데이터를 전달하는 방법을 설명한 방법처럼, 여기에서 내 대답을 업데이트하고, 당신이

@objc func newNote() { 
    let noteTitle: String = "" 
    noteData.insert(noteTitle, at: 0) 
    let indexPath: IndexPath = IndexPath(row: 0, section: 0) 
    tableView.insertRows(at: [indexPath], with: .automatic) 
    tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none) 
    selectedRow = indexPath.row 
    let detailVC = DetailViewController() 
    detailVC.masterView = self 
    navigationController?.pushViewController(detailVC, animated: true) 
} 
: 당신은 당신이 당신의 newNote() 기능을 적용해야합니다 자체를 업데이트하기 위해 저장 새로운 테이블 뷰 셀의 새 메모도

먼저 만드는 곳뿐만 아니라 다양한 장소에서이 작업을 수행하는

어디에 selectedRow 변수를 설정하는 당신의 indexPath를 삽입하고 또한 통과하여 당신은 또한 당신의 masterView 전달도 마찬가지로, didSelectRow을 변경 내가 게시 된 동일한 솔루션을 사용하지만, 필요 당신의 DetailsViewController()

두 번째로 masterView 및 또한 selectedRow 거기는 다음과 같이해야하므로 :

let detailVC = DetailViewController() 
    detailVC.noteText = noteData[indexPath.row] 
    detailVC.masterView = self 
    selectedRow = indexPath.row 
    navigationController?.pushViewController(detailVC, animated: true) 

셋째 당신의 DetailViewController 한 가지 텍스트가 텍스트를 입력 할 때마다 볼 누락 noteText하고 viewWillDisappear 운전 방식을 업데이트하지 않는있다 이에서 돌아 갈 때

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    masterView?.newRowLabel = textView.text 
} 

넷째, D, 당신은 당신의 viewWillDisappear 직접과 같이 textView에 액세스 할 수 변경 쉽게 솔루션을하지만, 자기에 텍스트 뷰의 대리자를 설정하고 변경 내용을 텍스트로 듣고 필요가에 의존 에서

saveNote() 

을 : 화면이, 당신의 MasterViewController이 viewWillAppear 방법이를 저장할 필요가 일부 변경이 메모가 저장되면 당신이 전화 후, 그래서 실제로는별로 당신이 당신 selectedRow 변수를 재설정해야 할뿐만 아니라이 필요하다 다음 줄도 추가합니다 :

selectedRow = -1 
+0

@cldrr에게 회신을 읽어주십시오. – Boletrone

+0

@ BoleTzar 방금 해결해야 할 코드에 문제가있는 곳을 지적하여 답변을 업데이트했습니다. –

1

대신 당신은 DetailViewController를 생성하고 삭제할 수 있습니다이

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let detailViewController = DetailViewController() 
    detailViewController.noteText = noteData[indexPath.row] 
    detailViewController.masterView = self 
    navigationController?.pushViewController(detailViewController, animated: true) 
} 

기능 prepare처럼 noteText을 할당 할 수 있습니다

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    navigationController?.pushViewController(DetailViewController(), animated: true) 
} 

의 :

여기 내 놀이터 스토리 보드를 사용하지 않기 때문에 사용되지 않습니다.

그리고 적응하는 것을 잊지 마세요 newNote() :

@objc func newNote() { 
    let noteTitle: String = "" 
    noteData.insert(noteTitle, at: 0) 
    let indexPath: IndexPath = IndexPath(row: 0, section: 0) 
    tableView.insertRows(at: [indexPath], with: .automatic) 
    tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none) 
    let detailViewController = DetailViewController() 
    detailViewController.masterView = self 
    navigationController?.pushViewController(detailViewController, animated: true) 
} 
+0

'prepare' 함수를 삭제하고 제안한 코드를 추가했지만'UITextView'에 입력 한 텍스트가 저장되지 않고 테이블 셀이 아직 업데이트되지 않습니다. 어떤 생각? – Boletrone

+0

'didSelectRowAt ...'에'detailViewController.masterView = self'를 추가했습니다. 그리고'newNote' 함수를 적용하여'masterView'를 설정해야합니다. – cldrr