UITableView& UICollectionView在两种不同的情况下显示相同的数据

时间:2015-12-29 07:30:39

标签: ios swift uitableview uicollectionview

我有一个场景,当用户点击特定UITableView时,我需要在UIButton中显示一些数据,并在点击另一个UICollectionView时在UIbutton中显示相同的数据}。但在同一视图控制器中。

首先,当选择表格视图时,我们将在表格视图中查找数据 - 它会以表格视图格式显示数据

当单击集合视图按钮时,我们将在集合视图中显示数据。

我认为我们可以通过以下方式实现这一目标 -

1)在场景停靠栏中创建2个视图一个具有表视图,另一个具有集合视图并在我们的代码中使用它们。

2)创建具有TableView&amp ;;的UIView类的2 .xib文件 CollectionView并在选择特定按钮时加载它们。

那我怎么能实现这个功能呢?请提出一些在这种情况下可能非常可靠的方法,如果可能的话,请分享任何源代码或链接,或提供详细解释,以帮助像我这样的iOS新手。

7 个答案:

答案 0 :(得分:1)

您可以使用UIPageViewController。只需记住禁用pageviewcontroller的滚动。

答案 1 :(得分:1)

似乎要制作自定义视图容器。 谷歌的关键字为iOS custom container,资源很多。

答案 2 :(得分:0)

您还可以在同一视图中添加UItableView和UICollectionView,并使其中一个隐藏在每个状态中。因此,默认情况下,会选择隐藏collectionView的第一个按钮。当用户点击第二个按钮时,您可以隐藏表视图并取消隐藏集合视图。您还可以添加动画以转换两个状态以使其看起来很好。

答案 3 :(得分:0)

如果我们只是考虑这个问题,那么我们只能使用一个带有两种不同类型的Layouts和不同大小的cellView的collectionView。但我不确定,Aujtolayout的复杂程度是多少(如果你使用的话)。

答案 4 :(得分:0)

首先使用UITableViewUICollectionView baseClass创建两个类文件,详细信息请参见下面的屏幕截图。 enter image description here

在实现文件中为这两个类添加datasource和delegate方法。

现在在.h(界面)文件中添加以下代码,以显示表/集合视图。

#import "collectionData.h"
#import "tableData.h"

@interface ViewController : UIViewController {
    collectionData *collectionObj;
    tableData *tableObj;

    IBOutlet UIView *viewData;
}

@end

在.m(实现)文件中:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *arrCollection = [[NSBundle mainBundle] loadNibNamed:@"collectionData" owner:self options:nil];
    collectionObj = (collectionData *)[arrCollection objectAtIndex:0];


    NSArray *arrTable = [[NSBundle mainBundle] loadNibNamed:@"tableData" owner:self options:nil];
    tableObj = (tableData *)[arrTable objectAtIndex:0];

    [self displayView:tableObj];

}

- (IBAction)btnTableClick:(id)sender {
    [self displayView:tableObj];
}

- (IBAction)btnCollectionClick:(id)sender {
    [self displayView:collectionObj];
}

- (void)displayView: (UIView *)viewObj {
    for(UIView *view in viewData.subviews) {
        [view removeFromSuperview];
    }

    [viewData addSubview:viewObj];
}

请注意,它并不是您想要它的唯一基本想法。

答案 5 :(得分:0)

我个人建议任何一个面临这种情况的人去看看很多人都不关心的Scene Dock。它需要更少的编码并且非常容易。我认为它可以被视为.xib的替代品。

我在链接中跟踪了有关场景停靠的一些细节 - http://www.raywenderlich.com/115697/ios-9-storyboards-tutorial-whats-new-in-storyboards

在视图控制器的场景底座中添加表视图和集合视图,然后进行编码。这是一个可以做到的锄头的例子。

主要故事板 -

enter image description here

以下是所有解释的编码 -

  import UIKit

class CategoriesViewController: UIViewController,UITableViewDataSource,UITableViewDelegate,UICollectionViewDataSource,UICollectionViewDelegate
{




    var mainarray : NSMutableArray!
    var cararray : NSMutableArray!
    var bikearray : NSMutableArray!




    @IBOutlet var TableVieww: UITableView!//table view outlet in scene dock

    @IBOutlet var collctnvieww: UICollectionView!//scene dock collection view outlet
    @IBOutlet weak var rqdview: UIView!// view on which you would be adding the collection/table view


    override func viewDidLoad()
    {
        super.viewDidLoad()

         cararray = ["audii","duster"]
         bikearray = ["honda","bajaj"]

        TableVieww.dataSource = self
        TableVieww.delegate = self

        collctnvieww.delegate = self
        collctnvieww.dataSource = self
        // Do any additional setup after loading the view.
    }

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



    @IBAction func Car(sender: AnyObject)//outlet of car button
    {
        mainarray = cararray as NSMutableArray
        self.TableVieww.reloadData()
        self.collctnvieww.reloadData()
    }



    @IBAction func bike(sender: AnyObject)//outlet of bike button
    {
        mainarray = bikearray as NSMutableArray
        self.TableVieww.reloadData()
        self.collctnvieww.reloadData()
    }




    @IBAction func showcllctnview(sender: AnyObject)//when you want to show collection view for cars/bikes
    {

        print("collection view called")
        collctnvieww.frame = CGRectMake(0, 0, rqdview.frame.width, rqdview.frame.height)//you change the frame size of your views as per your requirement.


        self.rqdview.addSubview(collctnvieww)
    }



    @IBAction func showtableview(sender: AnyObject)//when you want to show table view for cars/bikes

    {
        print("table view called")
        TableVieww.frame = CGRectMake(0, 0, rqdview.frame.width, rqdview.frame.height)

        self.rqdview.addSubview(TableVieww)
    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return mainarray.count
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = TableVieww.dequeueReusableCellWithIdentifier("cellreuse", forIndexPath: indexPath)

        cell.textLabel!.text = mainarray[indexPath.row] as? String

        return cell

    }

//coding for collection view
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        return mainarray.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collctnvieww.dequeueReusableCellWithReuseIdentifier("collectioncell", forIndexPath: indexPath) as! CategoriesCollectionViewCell

        cell.nmlbl.text = mainarray[indexPath.row] as? String
        return cell

    }





    }

但是,如果我只能使用一个数据源进行表视图和集合视图,我认为代码可以缩短。如果任何人可以提出一些建议,可能会有帮助。

答案 6 :(得分:0)

您的初始视图控制器可以容纳按钮和" Container View Controller"根据按下的按钮,它将在UITableViewControllerUICollectionViewController之间进行切换。当点击按钮时,初始视图控制器将传递产品数据并使其自身成为子视图控制器的代理。

在任一子视图控制器中选择单元格时,它们可以调用委托(初始视图控制器)上的方法,并且可以相应地执行操作。

要将数据传递到您想要首先显示的子视图控制器(例如UITableViewController),请在初始视图控制器加载时执行segue。