有没有办法为下面的案例编写简洁的代码

时间:2017-08-03 04:37:14

标签: ios swift uicollectionview

我有一个有两个标签的应用。在第一个BookVC标签中,我使用UICollectionViewController来显示图书,并在didSelectItemAtIndexPath中调用推送BookDetailVC的函数。

在书签标签中,我想显示所有书签,当用户选择某本书时,我想推BookDetailVC。我知道可以通过编写与BookVC中相同的代码来实现。但我不想重复相同的代码。

我尝试制作BookmarkVC BookVC的子类,最后在BookVCBookmarkVC显示同一本书,因为我使用的是同一本书来自BookVC的UICollectionView实例。有没有办法覆盖UICollectionView的{​​{1}}或任何其他方法来解决。对不起,我的英语不好。感谢。

enter image description here

2 个答案:

答案 0 :(得分:0)

你采取了错误的做法。您描述书签和书籍的方式查看控制器,在我看来它们是相同的,唯一改变的是内容。

因此,由于集合视图使用数据源,您所要做的就是根据您是要显示所有书籍还是仅显示已添加书籍的书籍来更改数据源。

添加了代码:

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

答案 1 :(得分:0)

我认为你做错了只需要根据点击的按钮重新加载集合视图取boolean 的 isBookMarkCliked:BOOL

为了更好的可读性,请创建Book for Book 喜欢

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

并使用Book Model

全局声明两个数组
arrForBooks:[Book] = []
arrForBookMarkedBooks:[Book] = []

使用扩展名

创建CollectionViewDelegate方法
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
    }

}