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
相关产品推荐
相关产品推荐

