2017-06-29 17 views
-3

私はリストの並べ替えのテーブルビューから戻るときに、私のコレクションビューがリロードされませんでした。私は戻ったときにコレクションビューを再読み込みするには?

私はいくつかのトピックを読んだが、何が間違っているのか分からない。誰でもそれを見つけることができますか?

コード場所の一部をすばやくファイルに記述し、このViewControllerを含めることができます。はい、どうですか?私はもっ​​と多くのViewControllerでそれを使用しているからです。

以下は私のコードです。

ありがとうございました。

import UIKit 
import AVFoundation 

class CollectionViewController: UICollectionViewController { 

    @IBOutlet var soundBoard: UICollectionView! 

    var list = ["January","February","March","April","May","June", "July","August","September","October","November", "December"] 
    var bgColor = [""] 

    var buttonOn: Bool = true 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let blockItems = UserDefaults.standard.object(forKey:"soundboard") 

     if(blockItems != nil) { 
      list = blockItems as! [String] 
     } 

     let itemSize = UIScreen.main.bounds.width/2 - 2 
     let itemHeight = itemSize/2 
     let layout = UICollectionViewFlowLayout() 
     layout.sectionInset = UIEdgeInsetsMake(3, 0, 3, 0) 
     layout.itemSize = CGSize(width: itemSize, height: itemHeight) 

     layout.minimumInteritemSpacing = 3 
     layout.minimumLineSpacing = 3 

     soundBoard.collectionViewLayout = layout 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 

     self.collectionView!.reloadData() 
    } 

    // MARK: - Collection View 

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of items 

     return list.count 
    } 


    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> MyCollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCollectionViewCell 

     cell.cellTitle.text = list[indexPath.row] 

     return cell 
    } 

    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     Speak(currentTitle: list[indexPath.row]) 
    } 


    // MARK: - Speak function 


    let synth = AVSpeechSynthesizer() 
    var myUtterance = AVSpeechUtterance(string: "") 

    func Speak(currentTitle: String) { 

     if !synth.isSpeaking { 
      // Controleert volume 
      let volume = AVAudioSession.sharedInstance().outputVolume 

      if volume < 0.5 { 
       MuteButton() 
      } 

      // Spreekt de tekst uit 
      let myUtterance = AVSpeechUtterance(string: currentTitle) 
      myUtterance.rate = 0.4 
      myUtterance.volume = 1 

      if let theVoice = UserDefaults.standard.object(forKey:"voice") { 
       myUtterance.voice = AVSpeechSynthesisVoice(language: theVoice as? String) 
      } 

      synth.speak(myUtterance) 
     } 
    } 


    func MuteButton() { 

     let alertController = UIAlertController(title: "Check your volume", message: 
      "Please check your volume or mute button.", preferredStyle: UIAlertControllerStyle.alert) 
     alertController.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.default,handler: nil)) 

     self.present(alertController, animated: true, completion: nil) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: -- Save UserDefaults 

    func save() { 
     UserDefaults.standard.set(self.list, forKey:"soundboard") 
     UserDefaults.standard.synchronize() 

     self.collectionView?.reloadData() 
    } 


    // MARK: -- Add new sound item 

    @IBAction func addNew(_ sender: Any) { 

     let alertController = UIAlertController(title: "Create a new sound", message: "", preferredStyle: UIAlertControllerStyle.alert) 

      alertController.addTextField { (textField: UITextField) in 
       textField.keyboardAppearance = .dark 
       textField.keyboardType = .default 
       textField.autocorrectionType = .default 
       textField.placeholder = "Type something here" 
       textField.clearButtonMode = .whileEditing 
      } 


     alertController.addAction(UIAlertAction(title: "Create", style: .default) { [weak alertController] _ in 
      if let alertController = alertController { 
       let loginTextField = alertController.textFields![0] as UITextField 

       self.list.append(loginTextField.text!) 

       self.save() 
      } 
     }) 


     alertController.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default,handler: nil)) 

     self.present(alertController, animated: true, completion: nil) 
    } 
} 
+1

コードにコレクションビューが表示されません。 – ozgur

+0

実際、間違ったViewControllerでした。今私はそれを更新しました。 –

+0

問題に関する十分な情報を提供していません。このビューコントローラのデータソースに対して、他のビューコントローラは何をしますか?それはいつですか? – rmaddy

答えて

0

ここでは2つのことが起こっています。まず、CollectionViewControllerに2つの異なるコレクションビューがあるように見えます。スーパークラスから継承されたcollectionViewと宣言したsoundboardです。 viewWillAppearでは、collectionViewにリロードするように指示します。これがIBに夢中になっていないなら、何も動かないでしょう。

第2の問題は、soundboardTableViewControllerでは、ビューが読み込まれた後でユーザーの既定値を正確なデータで更新することです(CollectionViewController)。

あなたはこの移動する必要があります。コレクションビューを再ロードしてからリロードし、右コレクションビューを語っていることを確認するためにあなたの呼び出しの前にviewWillAppear

let blockItems = UserDefaults.standard.object(forKey:"soundboard") 
if(blockItems != nil) { 
    list = blockItems as! [String] 
} 

を。

+0

スーパー作品、ありがとうございました! –

0

ここで間違っている可能性があるいくつかがあります。しかし、それは他のView Controllerのコードを見るのに役立ちます。

まず、モデル配列を正しく並べ替えることは確実ですか?迅速な配列は値型であることを忘れないでください。つまり、配列を別のビューに渡すと、その配列のコピーを渡していて、コレクションビューのコントローラに配列は渡していないということです。参照を渡すことができるオブジェクトにモデル配列をラップする方が良いでしょう。その詳細についてはhere

また、ビューのライフサイクルではなくモデルの変更をリロードする方がよいでしょう。現在のコードでこれを行うには、次のようなことができます:

var list = ["January","February","March","April","May","June", "July","August","September","October","November", "December"] { 
    didSet { 
     self.collectionView?.reloadData() 
     // or 
     self.soundBoard.reloadData() 
     // I'm confused about which collection view you're using/trying to reload. 
    } 
} 

ご質問がある場合はお知らせください。私は目を覚まし、必要に応じて私の答えを編集することができます。

0

これは、他のViewControllerのコードで、行を並べ替えることができ、< Backをタップできます。

import UIKit 

class soundboardTableViewController: UITableViewController { 

    var list = ["January","February","March","April","May","June", "July","August","September","October","November", "December"] 



    override func viewDidLoad() { 
     super.viewDidLoad() 


     self.navigationItem.rightBarButtonItem = self.editButtonItem 

     let blockItems = UserDefaults.standard.object(forKey:"soundboard") 

     if(blockItems != nil) { 
      list = blockItems as! [String] 
     } 
    } 


    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return list.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

     cell.textLabel?.text = list[indexPath.row] 

     return cell 
    } 


    // Override to support conditional editing of the table view. 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 


    /* Override to support editing the table view.*/ 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      list.remove(at: indexPath.row) 

      UserDefaults.standard.set(self.list, forKey:"soundboard") 
      UserDefaults.standard.synchronize() 

      tableView.reloadData() 
     } 
    } 

    // Override to support rearranging the table view. 
    override func tableView(_ tableView: UITableView, moveRowAt indexPath: IndexPath, to: IndexPath) { 
     /*let itemToMove = list[indexPath.row] 
     list.remove(at: indexPath.row) 
     list.insert(itemToMove, at: indexPath.row) 

     UserDefaults.standard.set(self.list, forKey:"soundboard") 
     UserDefaults.standard.synchronize()*/ 

     let itemToMove = list[indexPath.row] 
     list.remove(at: indexPath.row) 
     list.insert(itemToMove, at: to.row) 

     UserDefaults.standard.set(self.list, forKey:"soundboard") 
    } 

    override func setEditing(_ editing: Bool, animated: Bool) { 
     super.setEditing(editing, animated: animated) 

     if(self.isEditing) { 

     } 
    } 


    // Override to support conditional rearranging of the table view. 
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the item to be re-orderable. 
     return true 
    } 



    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 


} 
+0

これは質問ではなく回答として追加する必要があります。 –

関連する問題