2016-12-23 1 views
0

1 개의 뷰 컨트롤러 내에 2 개의 콜렉션 뷰가 있습니다. 제 2 콜렉션 뷰가 첫 콜렉션 뷰에있는 아이템의 선택에 기초하여 그 내용을 디스플레이하기를 원합니다. 필자는 모든 것을 표시 할 데이터를 얻는 지점으로 가져 왔지만 viewcontroller가 데이터 (셀 이미지, 설명 등)를 표시하지 않고 다시로드하지 않기 때문에 생각합니다. 내가 강제로보기를 강제로 새로 고칠 수 있습니까? 아니면 더 좋은 방법이 있거나 2 번째 collectionview에서 결과를 보여줄 수 있습니까? 클래스에 대한collectionview의 결과에서 collentionview를 표시합니다.

전체 코드는 다음과 같습니다 : 모든 UI 업데이트가 주 스레드에서 수행해야하기 때문에

import UIKit 
import Parse 

private let reuseIdentifierPart = "CellPart" 
private let reuseIdentifierPiece = "CellPiece" 

class JourneyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 

    // passed packName from PackViewController 
    var selectedPack: String! 
    var selectedPart: String! 

    @IBOutlet var collectionViewPart: UICollectionView! 
    @IBOutlet var collectionViewPiece: UICollectionView! 

    struct partStruct { 
     var partName : String 
     var partDescription : String 
     var partTitle : String 
     var partImage : PFFile 
     var partID: String 
    } 

    struct pieceStruct { 
     var pieceName : String 
     //var pieceDescription : String 
     //var pieceTitle : String 
     var pieceImage : PFFile 
    } 

    var partArray = [partStruct]() 
    var pieceArray = [pieceStruct]() 

    var refreshView: UIViewController! 


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

     // if selected pack not nil 
     //--------------------------------------------- PART DISPLAY IN COLLECTION ---- 
     if let partsToDisplay = selectedPack { 
      let partQuery = PFQuery(className: "Part") 
       //have to create PFObject from selectedPack 
       partQuery.whereKey("fromPack", equalTo: PFObject(outDataWithClassName: "Pack", objectId: selectedPack)) 
       partQuery.findObjectsInBackground(block: { (objectsArray, error) in 
        if error != nil { 
         print(error!) 
        } else if let parts = objectsArray { 
         for object in parts { 

          let arrayName = object.object(forKey: "partName") as! String 
          let arrayDescription = object.object(forKey: "partDescription") as! String 
          let arrayTitle = object.object(forKey: "partTitle") as! String 
          let arrayImage = object.object(forKey: "partImage") as! PFFile 
          //let arrayPoint = object.object(forKey: "fromPack") as! String 
          let arrayID = object.objectId as String! 
          self.partArray.append(partStruct(partName: arrayName, partDescription: arrayDescription, partTitle: arrayTitle, partImage: arrayImage, partID: arrayID!)) 
         } 
         self.partArray = self.partArray.sorted{ $0.partName < $1.partName } 
         self.collectionViewPart?.reloadData() 
        } 
       }) 
     } 

    }//viewwillappear 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     if collectionView == self.collectionViewPart { 
      //--------------------------------------------- PIECE DISPLAY IN COLLECTION ---- 
      print("I selected an item in the Parts stack") 
      selectedPart = self.partArray[indexPath.item].partID 
      print("i selected item \(selectedPart)") 

      if let piecesToDisplay = selectedPart { 
       let pieceQuery = PFQuery(className: "Piece") 
       //have to create PFObject from selectedPack 
       pieceQuery.whereKey("fromPart", equalTo: PFObject(outDataWithClassName: "Part", objectId: selectedPart)) 
       pieceQuery.findObjectsInBackground(block: { (objectsArray, error) in 
        if error != nil { 
         print(error!) 
        } else if let pieces = objectsArray { 
         print(objectsArray?.count) 
         for object in pieces { 

          let arrayName = object.object(forKey: "pieceName") as! String 
          let arrayImage = object.object(forKey: "pieceImage") as! PFFile 

          self.pieceArray.append(pieceStruct(pieceName: arrayName, pieceImage: arrayImage)) 
         } 
         self.pieceArray = self.pieceArray.sorted{ $0.pieceName < $1.pieceName } 
         self.collectionViewPiece?.reloadData() 
        } 
       }) 

      } else { 
       // this is for selecting somehitng in the vertical stack 
       print("WERE GOING TO GO TO THE NEXT SCREEN AND PLAY THE SOUND FILE") 

      } 
     } 
    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     if collectionView == self.collectionViewPart { 

      //pass this to the piece query when selected 
      let selectedPart = self.partArray[indexPath.item].partName 
      //--------------------------------------------- PART HOW TO DISPLAY EACH ITEM ---- 

      let cellPart: PartCollectionViewCell = collectionViewPart.dequeueReusableCell(withReuseIdentifier: reuseIdentifierPart, for: indexPath) as! PartCollectionViewCell 

      //cellPart.labelCell.text = self.packArray[indexPath.item].packDescription 
      //cellPart.labelCell.textColor = MyFunctions.UIColorFromHEX(hexValue: 0x0c1537) 
      cellPart.imageCellPart.file = self.partArray[indexPath.item].partImage 

      cellPart.imageCellPart.loadInBackground() 

      cellPart.imageCellPart.layer.masksToBounds = true 
      cellPart.imageCellPart.layer.cornerRadius = cellPart.imageCellPart.frame.height/2 
      cellPart.imageCellPart.layer.borderWidth = 3 
      cellPart.imageCellPart.layer.borderColor = MyFunctions.UIColorFromHEX(hexValue: 0x62aca2).cgColor 

      return cellPart 

     } else { 
      //--------------------------------------------- PIECE HOW TO DISPLAY EACH ITEM ---- 

      let cellPiece: PieceCollectionViewCell = collectionViewPiece.dequeueReusableCell(withReuseIdentifier: reuseIdentifierPiece, for: indexPath) as! PieceCollectionViewCell 

      //cellPiece.labelCell.text = self.packArray[indexPath.item].packDescription 
      //cellPiece.labelCell.textColor = MyFunctions.UIColorFromHEX(hexValue: 0x0c1537) 
      cellPiece.imageCellPiece.file = self.pieceArray[indexPath.item].pieceImage 

      cellPiece.imageCellPiece.loadInBackground() 

      cellPiece.imageCellPiece.layer.masksToBounds = true 
      cellPiece.imageCellPiece.layer.cornerRadius = cellPiece.imageCellPiece.frame.height/2 
      cellPiece.imageCellPiece.layer.borderWidth = 3 
      cellPiece.imageCellPiece.layer.borderColor = MyFunctions.UIColorFromHEX(hexValue: 0x62aca2).cgColor 

      return cellPiece 
     } 

    } 
    // MARK: UICollectionViewDataSource 

    func numberOfSections(in collectionView: UICollectionView) -> Int { 
     return 1 
    } 


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     if collectionView == self.collectionViewPart { 
      return self.partArray.count 
     } else { 
      return self.pieceArray.count 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 


}//class 
+0

우선 대리인을 자기에게 할당하고 결과를 작성하십시오. – C0mrade

답변

0

self.collectionViewPiece?.reloadData()는 주 스레드에서 발생한다. 그것은

DispatchQueue.main.async(execute: { 
      self.collectionViewPiece?.reloadData() 
     }) 

didSelectItemAt 대신 단지

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    if collectionView == self.collectionViewPart { 
     //--------------------------------------------- PIECE DISPLAY IN COLLECTION ---- 
     print("I selected an item in the Parts stack") 
     selectedPart = self.partArray[indexPath.item].partID 
     print("i selected item \(selectedPart)") 

     if let piecesToDisplay = selectedPart { 
      let pieceQuery = PFQuery(className: "Piece") 
      //have to create PFObject from selectedPack 
      pieceQuery.whereKey("fromPart", equalTo: PFObject(outDataWithClassName: "Part", objectId: selectedPart)) 
      pieceQuery.findObjectsInBackground(block: { (objectsArray, error) in 
       if error != nil { 
        print(error!) 
       } else if let pieces = objectsArray { 
        print(objectsArray?.count) 
        for object in pieces { 

         let arrayName = object.object(forKey: "pieceName") as! String 
         let arrayImage = object.object(forKey: "pieceImage") as! PFFile 

         self.pieceArray.append(pieceStruct(pieceName: arrayName, pieceImage: arrayImage)) 
        } 
        self.pieceArray = self.pieceArray.sorted{ $0.pieceName < $1.pieceName } 
        DispatchQueue.main.async(execute: { 
      self.collectionViewPiece?.reloadData() 
     }) 
       } 
      }) 

     } else { 
      // this is for selecting somehitng in the vertical stack 
      print("WERE GOING TO GO TO THE NEXT SCREEN AND PLAY THE SOUND FILE") 

     } 
    } 
} 
+0

메신저에 약간의 멍청한 멍청이가 있습니다. 그래서 주 스레드가 무슨 뜻인지 확실하지 않습니까? 이것은 클래스 내부에서 작동하지 않으며 클래스 위에 허용되지 않습니다. – WanderingScouse

+0

같은 결과가 불행하게도 있습니다. 아픈 코드를 통해 돌아 가라. – WanderingScouse

0

메인 스레드에서이 작업을 실행하십시오 self.collectionViewPiece?.reloadData()에 위의 코드를 가지고 이런 식으로합니까.

self.collectionViewPiece?.reloadData() 
    self.collectionViewPiece?.layoutIfNeeded(); 
+0

불행히도 다른 결과가 나타나지 않았습니다 – WanderingScouse

+0

(1) '사용자 상호 작용 사용'을 사용하도록 설정 한 것으로 가정합니다. (2) 또한 정렬 후에 요소 (디버깅/로그)를 보시겠습니까? 'self.partArray = self.partArray.sorted {$ 0.partName <$ 1.partName}' – Sri

+0

예 상호 작용이 활성화되었으며 두 배열이 모두 올바르게 표시됩니다. – WanderingScouse

0

이유가 확실하지 않은 이유는 내가 스토리 보드에서 데이터 소스와 위임을 모두 설정했기 때문에 문제가 해결되었습니다.

override func viewDidLoad() { 
    super.viewDidLoad() 
    collectionViewPart.delegate = self 
    collectionViewPiece.delegate = self 
    collectionViewPart.dataSource = self 
    collectionViewPiece.dataSource = self 
} 
관련 문제