2017-08-03 5 views
0

私は2つのタブを持つアプリを持っています。最初のBookVCタブでは、書籍を表示するのにUICollectionViewControllerを使用し、didSelectItemAtIndexPathにはBookDetailVCをプッシュする関数を呼び出します。以下のケースで簡潔なコードを書く方法はありますか?

ブックマークタブでブックマークしたすべての書籍を表示したい場合、ユーザーが特定のブックを選択すると、BookDetailVCをプッシュしたいと思います。私はBookVCと同じコードを書くことでそれが達成できることを知っています。しかし、私は同じコードを繰り返したくない。

私はBookVCBookmarkVCサブクラスを作ってみました、私はBookVCからUICollectionViewの同じ1つのインスタンスを使用していますので、BookVCBookmarkVCの両方で同じ本を示すようなってしまったと思います。 UICollectionViewBookVCに上書きする方法はありませんか、解決する方法はありますか?私の悪い英語のために申し訳ありません。ありがとう。

enter image description here

答えて

0

あなたは間違ったアプローチを取っています。あなたのブックマークとあなたの本を記述する方法View Controller、私はそれらが同じであると思われます、唯一変化しているのはコンテンツです。

コレクションビューではデータソースを使用するため、すべてのブックを表示するか、ブックマークのみを表示するかによってデータソースを変更するだけです。


追加コード:私はあなたが間違って使用することをやっていると思う

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let viewController = storyboard.instantiateViewController(withIdentifier :"secondViewController") as! UIViewController 
self.present(viewController, animated: true) 
+0

を使用してCollectionViewDelegateメソッドを作成しブックモデルでグローバルに

arrForBooks:[Book] = [] arrForBookMarkedBooks:[Book] = [] 

を2つの配列を宣言。しかし、私は別々のvcでそれらを示したい。だから私はbookvcからbookmarkvcを継承しようとしています。 – noob

+0

サブクラスする必要はありません。たとえば、このBooksVCだけで新しいストーリーボードを作成し、プログラマチックにインスタンス化し、必要なときにいつでも表示することができます。デリゲートを設定するためにフラグなどを使用します。添付のコードを参照してください。 – Pochi

+0

@noob同じデータのためにVCを分離するのは良いことではありません。ブックのモデルを作成するソリューションを掲載していますので、どのブックがbookMarkedであるか簡単に識別できます –

0

だけクリックされたボタンに基づいてコレクションビューをリロードする必要がisBookMarkClikedブール を取る:より良いブール

Readablityは書籍のモデルを作成する のように

class Book { 
    var title: String 
    var author: String 
    var isBookMarked:Bool 
    init(title: String, author: String, isBookMarked:Bool) { 
     self.title = title 
     self.author = author 
     self.isBookMarked = isBookMarked 
    } 
} 

、はい、彼らは同じだ延長

extension YourClassVC: UICollectionViewDataSource,UICollectionViewDelegate 
{ 

    //MARK: UICollectionViewDataSource 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    { 
     if isBookMarkClicked 
     { 
     return arrForBookMarkedBooks.count 
     } 
     return arrForBooks.count 
    } 

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

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellIdentifier", for: indexPath) as! YourCellClass 
     var currentBook:Book = nil 
     if isBookMarkClicked 
      currentBook = arrForStoreDetails[indexPath.row] 
     else 
      currentBook = arrForBookMarkedBooks[indexPath.row] 

     //Set data to cell from currentBook 
     return cell 

    } 

    //MARK: UICollectionViewDelegateFlowLayout 
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     collectionView.deselectItem(at: indexPath, animated: false) 
     //Your code to push BookDetailVC 
    } 

} 
関連する問題