2015-12-29 45 views
0

我在我需要時用戶點擊一個特定UIButtonUITableView顯示一些數據,並在另一個UIbutton點擊時在UICollectionView顯示相同的數據的情形相同的數據。但在同一個視圖控制器中。的UITableView&UICollectionView表示2種不同的情況下

首先在選擇表視圖,我們會在表視圖數據 - 它會顯示在表視圖格式數據

第二集合視圖按鈕被點擊時,我們會在收集視圖中顯示的數據。

我認爲,我們可以通過以下方式實現這一目標 -

1)創建場景碼頭一個具有表視圖而另一種集合視圖2次,並在我們的代碼中使用它們。

2)創建2.xib文件 UIView類具有TableView & CollectionView並加載他們選擇特定的按鈕。

那麼我怎麼能實現這個功能呢?請提出一些在這種情況下可能相當可靠的方法,如果可能的話,分享任何源代碼或鏈接或提供詳細的解釋,以幫助像我這樣的iOS新手。

+1

我想你把貝蒂的方式爲列表視圖網格視圖秒2自定義單元之一,那麼。當點擊網格時加載網格單元格,當點擊列表時加載列表單元格。 –

+0

使用集合視圖。 –

+0

可能是第二個是更好 –

回答

3

你可以使用UIPageViewController。只記得禁用pageviewcontroller的滾動。

+0

你在暗示的是具有多視圖控制器作爲其內容的UIPageViewController或什麼。因爲內容視圖控制器可以在一個時間只使用UITableView或UICollectionView中的一個視圖。 –

1

它似乎是自定義視圖容器。 谷歌與關鍵字iOS custom container,有很多資源。

+0

容器視圖控制器是一個不錯的選擇,但我不想使用容器視圖,因爲我的屏幕截圖中顯示的分類項數量不限,它僅適用於一個類別,例如 - 對於一種類型的項目。電子商務中有許多類別。對於每個加載兩個視圖控制器的類別,我不認爲這是明智的。 –

+0

它們可以通過'ONE'數據源來實現。但是'tableView'和'collectionView'共享同一個數據源對象。這個問題有很多選項,自定義容器是爲了調整更多'自定義'UI行爲。 – AechoLiu

+0

雅但你明白,這可能會使我的情況更加不方便,也會影響用戶體驗。那場景碼頭呢? –

0

您還可以在同一視圖中同時添加的UITableView和UICollectionView,使隱藏在每個州其中之一。所以默認情況下,第一個按鈕被選擇在隱藏collectionView的位置。當用戶點擊第二個按鈕時,您可以隱藏表格視圖並取消隱藏集合視圖。您還可以添加動畫來轉換兩個狀態,使其看起來不錯。

+0

但是添加2個視圖重疊在另一個上會使添加約束和佈局困難。 –

0

如果我們簡單地考慮這個問題,那麼我們只能使用一個具有兩種不同類型的佈局和不同大小的cellView的collectionView。但我不確定,Aujtolayout的複雜程度(如果使用的話)會有多少。

0

首先用UITableViewUICollectionView baseClass創建兩個類文件,更多細節參見下面的截圖。 enter image description here

併爲實現文件中的兩個類添加數據源和委託方法。

現在在要顯示錶格/集合視圖的.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]; 
} 

注意,它不是萬能的但你想這只是基本的想法。

0

我個人建議任何一個面臨這樣類型的情況去現場碼頭,許多不在乎使用。它需要的代碼非常少,而且非常容易。我認爲它可以被視爲.xib的替代品。

我跟有關的鏈接碼頭現場的一些細節 - http://www.raywenderlich.com/115697/ios-9-storyboards-tutorial-whats-new-in-storyboards

添加一個表格視圖和集合視圖在視圖控制器的現場對接,去編碼。這是一個可以完成的鋤頭的例子。

主要故事板 -

enter image description here

這裏去編碼所有explannations -

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 

    } 





    } 

但我仍認爲該代碼可以被縮短,如果我可以只使用一個數據源表視圖和集合視圖。如果任何人可以提出一些提示,這可能會有所幫助。

0

您的初始視圖控制器可以容納按鈕和一個「Container View Controller」,該按鈕將根據按下的按鈕在UITableViewControllerUICollectionViewController之間延續。輕觸按鈕時,初始視圖控制器將傳遞產品數據並將其自己作爲子視圖控制器的代表。

當細胞在任一孩子視圖控制器的選擇,他們可以調用該委託(您的初始視圖控制器)的方法,它可以採取相應的行動。

要傳遞數據到任何兒童視圖控制器要首先顯示(例如,UITableViewController),執行賽格瑞初始視圖控制器負載時。