gpt4 book ai didi

ios - 如何将 Storyboard中的 UITableViewCell 添加到以编程方式创建的 UITableView 对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:20 26 4
gpt4 key购买 nike

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

我使用 Collection View 创建了标签栏。接下来,我从 Storyboard 中将 UITableViewCell 添加到我的 View Controller 。

enter image description here

所以我得到了以下 View 。

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

最佳答案

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

  1. 据我了解,您的 UITableView 位于 UICollectionViewCell 中,因此请为您的 View 编写层次结构代码,即执行 UITableView 代码在 UICollectionViewCell 文件中。将 UITableView delegate\datasouceUICollectionViewCell 文件绑定(bind)并绑定(bind) UICollectionView 委托(delegate)\datasouceUIViewController。它使您可以轻松管理所有组件。

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

  3. 根据您的 UI 屏幕截图,我认为您不需要为 All TicketsResolved Tickets< 分别获取两个 UITableView/strong> 因为在特定时间用户选择所有工单已解决的工单。因此,采用一个 UITableView 并使用 reload tableview 属性并更改表格数据。

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

Edit

如何在 UI 上显示带有滚动效果的数据。

直到您的标题选项选择正确。

  1. 对于下方的黄色 View ,需要额外的 UIcollectionView

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

  3. 创建一个UIcollectionViewcell,并在其中添加UITableView
  4. 您的 UIcollectionViewcell 具有黄色 View 的大小。
  5. 要保持 UIcollectionViewcell 高度,您必须计算其内部 tableView 高度并使用 UICollectionViewDelegateFlowLayout< 调整 UIcollectionViewcell 高度 sizeForItemAtIndexPath; 方法。
  6. collectionView 中使用分页以获得更好的拖动效果并根据您的要求正确更新您的数据。
  7. 要在单个类中管理多个集合,请在 cellforItem

    中使用以下代码

    if(collectionView == tabCollectionView ){
    //在这里为选项卡集合编写代码
    }
    别的{
    //在这里为数据 collectionView 编写代码
    }

关于ios - 如何将 Storyboard中的 UITableViewCell 添加到以编程方式创建的 UITableView 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41735091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com