![](/img/trans.png)
[英]Same data is repeating in sections in UITableView and UICollectionView in swift 4
[英]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的复杂性是多少(如果您使用的话)。
首先使用UITableView
和UICollectionView
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 ”,后者将根据所按下的按钮在UITableViewController
和UICollectionViewController
之间进行UICollectionViewController
。 轻按一个按钮时,初始视图控制器将传递产品数据,并使其自身成为子视图控制器的委托。
在您的两个子视图控制器中选择一个单元格时,他们可以在委托(您的初始视图控制器)上调用方法,并且它可以采取相应的行动。
要将数据传递到您要首先显示的任何子视图控制器(例如UITableViewController
)中,请在加载初始视图控制器时执行segue。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.