You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Objective-C开发:如何将NSTableView选中数据传递到其他视图控制器

实现步骤

1. 遵守NSTableView代理协议

首先在你当前视图控制器的.h头文件中,添加NSTableViewDelegate协议声明:

@interface YourViewController () <NSTableViewDataSource, NSTableViewDelegate>

然后在viewDidLoad方法中设置表格的代理:

- (void)viewDidLoad {
    [super viewDidLoad];
    _climas = [[NSMutableArray alloc] init];
    // 新增这行 设置代理
    self.Tabla.delegate = self;
    [self CargarDatos];
}

额外提醒:你现有代码中success回调里的[NSThread sleepForTimeInterval:5.0f]必须删掉,这行代码会卡住主线程5秒,导致界面完全无法交互,没有任何存在意义。

2. 新建详情视图控制器

创建新的视图控制器类,命名为DetailViewController,在它的.h头文件中声明接收数据的属性:

#import <Cocoa/Cocoa.h>
#import "Clima.h"

@interface DetailViewController : NSViewController
// 用于接收选中行的天气数据
@property (nonatomic, strong) Clima *selectedClima;
@end

你可以在DetailViewController的xib或者viewDidLoad中,将selectedClima的各个属性渲染到对应的UI控件上。

3. 实现表格选中行的监听方法

在当前表格所在的视图控制器.m文件中,实现NSTableViewDelegate的选中回调方法:

#pragma mark - NSTableViewDelegate
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
    NSTableView *tableView = notification.object;
    NSInteger selectedRow = tableView.selectedRow;
    // 选中行合法的情况下才进行后续操作
    if (selectedRow >= 0 && selectedRow < _climas.count) {
        // 拿到选中行对应的天气数据
        Clima *selectedClima = _climas[selectedRow];
        // 初始化详情控制器
        DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        // 传值
        detailVC.selectedClima = selectedClima;
        // 跳转展示 这里以模态弹出为例,你也可以根据需求用导航push、sheet等展示方式
        [self presentViewControllerAsSheet:detailVC];
        // 如果要模态全屏的话可以用下面这个方法
        // [self presentViewController:detailVC animator:YES];
    }
}

补充说明

如果需要点击单元格就触发,而不是选中整行才触发,可以实现tableView:didClickTableColumn:方法配合点击的位置获取对应行数据,上面的选中整行的方案能满足绝大多数场景需求。

内容的提问来源于stack exchange,提问作者Saul Salcedo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:51:03