繁体   English   中英

UITableView和UICollectionView在2种不同情况下显示相同数据

[英]UITableView & UICollectionView showing same data in 2 different situations

我有一种情况,当用户单击特定的UIButton时,我需要在UITableView显示一些数据,而当单击另一个UIbutton时,则需要在UICollectionView显示相同的数据。 但是在同一个视图控制器中。

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

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

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

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

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

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

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

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

您还可以在同一视图中同时添加UItableView和UICollectionView并使其中之一隐藏在每个状态中。 因此,默认情况下,将选择第一个按钮,其中collectionView将被隐藏。 当用户点击第二个按钮时,您可以隐藏表格视图并取消隐藏集合视图。 您还可以添加动画以过渡两种状态,以使其看起来不错。

如果仅考虑此问题,那么我们只能使用具有两种不同类型的Layouts和大小不同的cellViews的一个collectionView。 但是我不确定Aujtolayout的复杂性是多少(如果您使用的话)。

首先使用UITableViewUICollectionView baseClass创建两个类文件,有关更多详细信息,请参见下面的屏幕快照。 在此处输入图片说明

并在实现文件中为这两个类添加数据源和委托方法。

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

#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];
}

请注意,它还不是全部,而您想要的只是基本概念。

我个人建议面对这种情况的任何人都可以使用Scene Dock,许多人都不愿意使用它。 它需要很少的编码,非常容易。 我认为可以将其视为.xib的替代方法。

我在链接中关注了有关场景基座的一些详细信息-http: //www.raywenderlich.com/115697/ios-9-storyboards-tutorial-whats-new-in-storyboards

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

主故事板-

在此处输入图片说明

这是所有说明的编码-

  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

    }





    }

但我仍然认为,如果我只能将一个数据源用于表视图和集合视图,则可以缩短代码。 如果有人可以提出一些提示,则可能会有所帮助。

您的初始视图控制器可以容纳按钮和“ Container View Controller ”,后者将根据所按下的按钮在UITableViewControllerUICollectionViewController之间进行UICollectionViewController 轻按一个按钮时,初始视图控制器将传递产品数据,并使其自身成为子视图控制器的委托。

在您的两个子视图控制器中选择一个单元格时,他们可以在委托(您的初始视图控制器)上调用方法,并且它可以采取相应的行动。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM