테이블 뷰와 컬렉션 뷰
동적인 콘텐츠 목록과 격자를 표시하기 위해 UITableView와 UICollectionView를 구현하고 사용자 지정합니다.
테이블 뷰와 컬렉션 뷰은(는) CoddyKit의 무료 Objective-C iOS Development for Legacy & Enterprise Apps 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Objective-C iOS Development for Legacy & Enterprise Apps 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
Meet UITableView
Welcome to lists! UITableView is a fundamental UIKit component used to display scrollable lists of data, commonly seen in apps for settings, contacts, or news feeds.
It's optimized for efficiency, only rendering the cells visible on screen, which makes it perfect for long lists without performance issues.
Data & Behavior for Tables
To work with a UITableView, you primarily interact with two protocols:
UITableViewDataSource: This tells the table view what data to display (e.g., number of rows, content for each cell).UITableViewDelegate: This handles how the table view behaves (e.g., row selection, height of rows, custom actions).
Your view controller typically conforms to both.
Your First Table View
Let's create a basic UITableView programmatically. This code snippet assumes it's within a UIViewController subclass that is set as the app's root view controller.
We add the table view to our controller's main view, making it fill the screen.
#import <UIKit/UIKit.h>
@interface MyTableViewController : UIViewController
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Create a UITableView filling the view
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// We'll set the data source and delegate in next steps
// tableView.dataSource = self;
[self.view addSubview:tableView];
}
@endPopulating Your Table
To display data, our MyTableViewController needs to conform to the UITableViewDataSource protocol. This means implementing two key methods:
numberOfRowsInSection:Tells the table how many rows to expect.cellForRowAtIndexPath:Provides theUITableViewCellfor each row.
We also register a basic UITableViewCell for reuse.
#import <UIKit/UIKit.h>
@interface MyTableViewController : UIViewController <UITableViewDataSource>
@property (nonatomic, strong) NSArray *dataItems;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.dataItems = @[@"Apple", @"Banana", @"Cherry", @"Date"];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.dataSource = self; // Set self as data source
// Register a basic UITableViewCell class for reuse
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[self.view addSubview:self.tableView];
}
#pragma mark - UITableViewDataSource methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataItems.count; // Number of items in our data array
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Dequeue (reuse) or create a cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = self.dataItems[indexPath.row]; // Set cell's text
return cell;
}
@endMaking Cells Unique
UITableViewCell is the view that displays content for each row. You can customize its appearance by:
- Using built-in styles (e.g.,
UITableViewCellStyleSubtitle). - Adding subviews directly to
cell.contentView. - Creating a custom subclass of
UITableViewCellfor complex layouts.
Always reuse cells with dequeueReusableCellWithIdentifier: for performance.
#import <UIKit/UIKit.h>
@interface MyTableViewController : UIViewController <UITableViewDataSource>
@property (nonatomic, strong) NSArray *dataItems;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.dataItems = @[@"Apple", @"Banana", @"Cherry", @"Date"];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.dataSource = self;
// Registering a cell class (we'll use the default for demo)
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CustomCell"];
[self.view addSubview:self.tableView];
}
#pragma mark - UITableViewDataSource methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Dequeue a cell, using UITableViewCellStyleSubtitle for more options
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath];
cell.textLabel.text = self.dataItems[indexPath.row];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Item #%ld", (long)indexPath.row + 1];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; // Add an arrow
return cell;
}
@endFlexible Grids: UICollectionView
While UITableView excels at vertical lists, UICollectionView offers much more flexibility for displaying content in customizable layouts, like grids, carousels, or complex dashboards.
It's ideal when you need to arrange items in non-linear or highly visual ways, such as photo galleries, product catalogs, or tag clouds.
Collection View's Data & Flow
Similar to table views, collection views rely on a UICollectionViewDataSource to provide data and a UICollectionViewDelegate for interaction.
A key difference is the UICollectionViewLayout. This object defines how items are arranged (e.g., grid, flow, custom). The most common is UICollectionViewFlowLayout for grid-like structures.
Building Your First Collection
Let's set up a basic UICollectionView. We'll also need to provide a UICollectionViewLayout to tell it how to arrange its items.
UICollectionViewFlowLayout is a good starting point for simple grids, allowing you to define item sizes and spacing.
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UIViewController
@property (nonatomic, strong) UICollectionView *collectionView;
@end
@implementation MyCollectionViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Create a flow layout for grid arrangement
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(100, 100); // Size for each item
layout.minimumInteritemSpacing = 10; // Min spacing between items in a row
layout.minimumLineSpacing = 10; // Min spacing between rows
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.collectionView.backgroundColor = [UIColor systemGroupedBackgroundColor]; // For contrast
// We'll set the data source in the next step
// self.collectionView.dataSource = self;
[self.view addSubview:self.collectionView];
}
@endPopulating Your Collection
To display items, our MyCollectionViewController needs to conform to UICollectionViewDataSource. It's similar to UITableViewDataSource:
numberOfItemsInSection:Specifies the number of items.cellForItemAtIndexPath:Provides theUICollectionViewCellfor each item.
Remember to register a cell class or nib before dequeuing!
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UIViewController <UICollectionViewDataSource>
@property (nonatomic, strong) NSArray *dataItems;
@property (nonatomic, strong) UICollectionView *collectionView;
@end
@implementation MyCollectionViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.dataItems = @[@"Red", @"Green", @"Blue", @"Yellow", @"Orange", @"Purple"];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(80, 80);
layout.minimumInteritemSpacing = 5;
layout.minimumLineSpacing = 5;
layout.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5); // Padding around sections
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.collectionView.backgroundColor = [UIColor systemGroupedBackgroundColor];
self.collectionView.dataSource = self; // Set self as data source
// Register a basic UICollectionViewCell class
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CollectionCell"];
[self.view addSubview:self.collectionView];
}
#pragma mark - UICollectionViewDataSource methods
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return self.dataItems.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionCell" forIndexPath:indexPath];
// Simple customization: set background color based on item
NSArray *colors = @[[UIColor redColor], [UIColor greenColor], [UIColor blueColor], [UIColor yellowColor],
[UIColor orangeColor], [UIColor purpleColor]];
cell.backgroundColor = colors[indexPath.item % colors.count];
// Add a label to the cell for text (optional)
UILabel *label = (UILabel *)[cell.contentView viewWithTag:100];
if (!label) {
label = [[UILabel alloc] initWithFrame:cell.contentView.bounds];
label.tag = 100;
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:14];
[cell.contentView addSubview:label];
}
label.text = self.dataItems[indexPath.item];
return cell;
}
@endTable vs. Collection
Both UITableView and UICollectionView display lists of data, but they have different strengths.
Which of the following is a primary advantage of using UICollectionView over UITableView?
Recap: Lists & Grids
We explored UITableView for displaying efficient vertical lists and UICollectionView for highly customizable grid and non-linear layouts.
- Both use Data Source and Delegate protocols to manage content and behavior.
UITableViewis simpler for standard, single-column lists.UICollectionViewuses aUICollectionViewLayoutfor powerful and custom visual arrangements.
Mastering these components is crucial for building dynamic and engaging iOS user interfaces.
자주 묻는 질문
“테이블 뷰와 컬렉션 뷰” 강의는 무료인가요?
네 — “테이블 뷰와 컬렉션 뷰” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Objective-C iOS Development for Legacy & Enterprise Apps 강의 전체를 잠금 해제할 수 있습니다. Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 총 4개의 강의가 포함되어 있습니다.
“테이블 뷰와 컬렉션 뷰”에서 뭘 배우나요?
동적인 콘텐츠 목록과 격자를 표시하기 위해 UITableView와 UICollectionView를 구현하고 사용자 지정합니다. 브라우저에서 직접 실행하는 실습 코드로 Objective-C iOS Development for Legacy & Enterprise Apps을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Objective-C iOS Development for Legacy & Enterprise Apps을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Objective-C iOS Development for Legacy & Enterprise Apps은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“테이블 뷰와 컬렉션 뷰” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Objective-C iOS Development for Legacy & Enterprise Apps 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Objective-C iOS Development for Legacy & Enterprise Apps 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.