如何从故事板添加UITableViewCell到以编程方式创建的UITableView对象?

时间:2017-01-19 06:23:05

标签: ios objective-c

在我的iOS应用中,我的标签栏有两个标签,如下所示。对于每个选项卡,我以编程方式创建了UITableView对象。 enter image description here

我使用集合视图创建了标签栏。接下来,我从故事板中将UITableViewCell添加到我的视图控制器。

enter image description here

所以我得到了以下观点。

enter image description here

但是现在当我运行我的应用程序时,我无法看到UItableviewcell。在我犯错误的地方,我无法得到。请帮忙。

以下是我的代码。

#import "TicketsViewController.h"
#import "TabBarCollectionViewCell.h"
#import "TicketTableViewCell.h"
#import "Constants.h"

@interface TicketsViewController () <UICollectionViewDelegate, UICollectionViewDataSource, UITableViewDelegate, UITableViewDataSource>

@property (weak, nonatomic) IBOutlet UICollectionView *tabBarCollectionView;
@property (weak, nonatomic) IBOutlet UICollectionViewFlowLayout *tabBarCollViewFlowLayout;
@property (weak, nonatomic) NSIndexPath *prevSelecedIndexPath;
@property (strong, nonatomic) NSArray *tabBarItemNamesArray;
@property (weak, nonatomic) IBOutlet UIView *parentViewForTableViews;
@property (weak, nonatomic) UIView *previousView;
@property (strong, nonatomic) NSMutableArray *tabRespectiveTableViewsArray;

@end

@implementation TicketsViewController

#pragma mark - lazy instantiation

- (NSArray *)tabBarItemNamesArray {
    if (!_tabBarItemNamesArray)
        _tabBarItemNamesArray = @[@"All Tickets", @"Resolved Tickets"];

    return _tabBarItemNamesArray;
}

- (NSMutableArray *)tabRespectiveTableViewsArray {
    if (!_tabRespectiveTableViewsArray)
        _tabRespectiveTableViewsArray = [[NSMutableArray alloc] initWithArray:@[(id)[NSNull null], (id)[NSNull null]]];

    return _tabRespectiveTableViewsArray;
}

#pragma mark - life cycle

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view layoutIfNeeded];

    [self tabBarItemNamesArray];
    [self tabRespectiveTableViewsArray];

    _tabBarCollectionView.delegate = self;
    _tabBarCollectionView.dataSource = self;
    _previousView = nil;

    _tabBarCollViewFlowLayout.itemSize = CGSizeMake(ceilf(_tabBarCollectionView.frame.size.width / 2), _tabBarCollViewFlowLayout.itemSize.height);

    _prevSelecedIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];
    [_tabBarCollectionView selectItemAtIndexPath:_prevSelecedIndexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}

#pragma mark - collection view

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return _tabBarItemNamesArray.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    TabBarCollectionViewCell *tabBarCollectionViewCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"TabBarCollectionViewCell" forIndexPath:indexPath];

    tabBarCollectionViewCell.tabView.tabTitle = [_tabBarItemNamesArray objectAtIndex:indexPath.row];
    if ([_tabRespectiveTableViewsArray objectAtIndex:indexPath.row] == (id)[NSNull null]) {
        UITableView *tableView = [[UITableView alloc] initWithFrame:_parentViewForTableViews.bounds style:UITableViewStylePlain];
        [tableView registerClass:[TicketTableViewCell class] forCellReuseIdentifier:@"TicketTableViewCell"];

        tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        tableView.showsVerticalScrollIndicator = YES;
        tableView.showsHorizontalScrollIndicator = NO;
        tableView.scrollEnabled = YES;
        tableView.pagingEnabled = NO;
        tableView.bounces = YES;
        tableView.userInteractionEnabled = YES;
        tableView.backgroundColor = [UIColor clearColor];

        tableView.translatesAutoresizingMaskIntoConstraints = NO;
        [_parentViewForTableViews addSubview:tableView];
        [_tabRespectiveTableViewsArray replaceObjectAtIndex:indexPath.row withObject:tableView];

        [_parentViewForTableViews addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v0]|" options:0 metrics:nil views:@{@"v0" : tableView}]];

        if (_previousView == nil) {
            [_parentViewForTableViews addConstraint:[NSLayoutConstraint constraintWithItem:tableView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:_parentViewForTableViews attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]];
            _previousView = tableView;
        }
        else {
            [_parentViewForTableViews addConstraint:[NSLayoutConstraint constraintWithItem:tableView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:_previousView attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]];
        }

        [_parentViewForTableViews addConstraint:[NSLayoutConstraint constraintWithItem:tableView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:_parentViewForTableViews attribute:NSLayoutAttributeWidth multiplier:1.0f constant:0.0f]];

        tableView.dataSource = self;
        tableView.delegate = self;
    }

    return tabBarCollectionViewCell;
}

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
    ((TabBarCollectionViewCell *)cell).tabView.tabSelected = cell.isSelected;

}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    if (_prevSelecedIndexPath)
        ((TabBarCollectionViewCell *)[collectionView cellForItemAtIndexPath:_prevSelecedIndexPath]).tabView.tabSelected = NO;
    ((TabBarCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath]).tabView.tabSelected = YES;
    _prevSelecedIndexPath = indexPath;

    [collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
    [((UITableView *)[_tabRespectiveTableViewsArray objectAtIndex:indexPath.row]) reloadData];
}

- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
    ((TabBarCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath]).tabView.tabHighlighted = YES;
}

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
    ((TabBarCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath]).tabView.tabHighlighted = NO;
}

#pragma mark - table view

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TicketTableViewCell *ticketTableViewCell = [tableView dequeueReusableCellWithIdentifier:@"TicketTableViewCell" forIndexPath:indexPath];

    ticketTableViewCell.labelTime.text = @"02:45 PM";

    return ticketTableViewCell;
}

#pragma mark - button actions

- (IBAction)buttonOpenDrawerAction:(id)sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:SHOW_LEFT_DRAWER object:self];
}

@end

3 个答案:

答案 0 :(得分:0)

在indexPath中的行的单元格中尝试此操作。

   TicketTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
            if (cell == nil)
            {
                cell = [[TicketTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TicketTableViewCell" owner:self options:nil];
                cell = [nib objectAtIndex:0];
            }

答案 1 :(得分:0)

您的代码工作几乎是正确的,但为了更好的编码风格,请遵循:

  1. 根据UITableView UICollectionViewCellUITableView位于UICollectionViewCell,您的视图的层次结构编码也是如此,即UITableView文件中的delegate代码。将datasouce UICollectionViewCell \ UICollectionViewdelegate文件绑定,并将datasouce UIViewController \ UITableView与{{1}绑定}。它使您可以轻松管理所有组件。

  2. 每当您为任何组件提供约束时,您也必须激活该约束,现在我看不到任何约束激活码,或者可能是我的眼睛错过了它。

  3. 根据您的用户界面屏幕截图,我认为您不需要为所有门票已解决的门票分别获得两个UITableView 因为在特定时间用户选择所有门票已解决门票。因此,请使用一个reload tableview并使用storyboard属性并更改表数据。

  4. 你已经完成了UITableView的一半工作,我认为你不需要以编程方式创建UITableView,因为你的UIcollectionView在运行时不会改变,只是改变它的数据。
  5.   

    修改

    如何在用户界面上显示带滚动效果的数据。

    您的标题选项选择正确无误。

    1. 对于较低的黄色视图,请执行额外的UIcollectionView

    2. UIcollectionViewcell的滚动属性设置为仅水平。

    3. 创建UITableView,并在其中添加UIcollectionViewcell
    4. 您的UIcollectionViewcell有黄色视图的大小。
    5. 要保持tableView高度,您必须使用UIcollectionViewcell UICollectionViewDelegateFlowLayout方法计算其内部sizeForItemAtIndexPath;高度并调整collectionView高度。
    6. 使用cellforItem中的分页来获得更好的拖动效果,并根据您的要求正确更新数据。
    7. 要在if(collectionView == tabCollectionView ){ // do code here for the tab collection } else{ // do code here for the data collectionView }

      中的代码下方管理单个班级中的多个集合

      Microsoft.Data.Services.Client

答案 2 :(得分:0)

        Please follow the below steps  
        1. Create two array. one array will contain the data for all tickets arrAllTickets and another will contain the data for resolved tickets arrResolved  
        2. Drag one table view below two button and give IBOutlet (tblTickets) and delegate and datasource to the your controller  
        3. Drag one tableview cell and give its identifier name for ex : TicketCell  
        4. Create the custom UITableviewCell class TicketCell.h and TicketCell.m file and assign it Cell created in 3rd step.
        5. Place required control from story board to cell as per your design and give outlet to it in TicketCell.h  
        6. In your controller class in UITableView Delegate method cellForRowAtIndexPath write down below code to place the cell to tableview.

        -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            TicketCell *cell=[tableView dequeueReusableCellWithIdentifier:@"TicketCell"];
     Ticket *objTicket=(isAllTicketsSelected)?[arrAllTickets objectAtIndex:indexPath.row]:[arrResolved objectAtIndex:indexPath.row];
        [cell.imgProfile sd_setImageWithURL:objTicket.profilePictureURL placeholderImage:[UIImage imageNamed:@"defaultlist"]];
        [cell.lblName setText:[objTicket fullName]];
         return cell;
        } 

7. Now take one bool variable isAllTicketsSelected. make isAllTicketsSelected=true when user tap on all tickets isAllTicketsSelected= false when user tap on resolved tickets. after that reload the tableview.

isAllTicketsSelected = true
[tblTicket reloadData];