在 UITableView 的 didSelectRowAtIndexPath 中,取得當前選中行對應的模型資料(如電影標題),並傳遞給即將 Push 的 DetailViewController 顯示。
id// VideoModel.h
@interface VideoModel : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *releaseDate;
@property (nonatomic, copy) NSString *posterPath;
@property (nonatomic, copy) NSString *overview;
// 其他欄位...
@end
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MovieCell *cell = [tableView dequeueReusableCellWithIdentifier:@"movieCell" forIndexPath:indexPath];
VideoModel *video = self.model.videos[indexPath.row]; // 強類型
// 日期格式化
if (video.releaseDate.length) {
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd";
NSDate *date = [fmt dateFromString:video.releaseDate];
fmt.dateFormat = @"MM/yyyy";
cell.videoDescriptionLabel.text = [NSString stringWithFormat:@"Released: %@", [fmt stringFromDate:date]];
} else {
cell.videoDescriptionLabel.text = @"N/A";
}
cell.videoTitleLabel.text = video.title;
// 圖片載入...
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
VideoModel *video = self.model.videos[indexPath.row];
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *vc = [sb instantiateViewControllerWithIdentifier:@"DetailVCID"];
// 核心:直接傳遞需要的屬性或整個模型
vc.movieTitle = video.title; // 方案 A:傳單一屬性
vc.videoModel = video; // 方案 B:傳整個模型(推薦)
[self.navigationController pushViewController:vc animated:YES];
}
// DetailViewController.h
@property (nonatomic, copy) NSString *movieTitle;
@property (nonatomic, strong) VideoModel *videoModel;
// DetailViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.title = self.movieTitle ?: self.videoModel.title;
// 其餘 UI 綁定...
}
若在 Storyboard 中已建立 Segue(Identifier: ShowDetail),可簡化為:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"ShowDetail" sender:self.model.videos[indexPath.row]];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"ShowDetail"]) {
VideoModel *video = (VideoModel *)sender;
DetailViewController *vc = segue.destinationViewController;
vc.videoModel = video;
}
}
id,定義明確模型類別。didSelectRowAtIndexPath 取模型、建 VC、賦值、Push 四步走。