范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

知识点纯代码实现NSOutlineView的详细步骤

  【故事背景】
  同事A和B都是小菜鸟一枚,最近都在自学MAC开发。
  同事A:我想写个菜单,分为主食、甜点、饮料等类目,每个类目下又有一些分类,用什么控件比较合适呢?NSTableView好像不太方便展示分组数据。
  同事B:可以试试NSOutlineView。NSOutlineView是NSTableView的子类,但是他比NSTableView多了分组的功能,使用层级的数据结构。
  同事A:我想用纯代码实现,但是查了半天都是用storyboard/xib实现的。
  同事B:那你参照storyboard的例子改为用纯代码实现的,也不难吧。创建一个OSX项目工程,新建一个NSViewController,在ViewController中添加NSOutlineView对象并实现NSOutlineViewDataSource和NSOutlineViewDelegate相应的方法……
  说起来简单,不过我在实践中还是遇到了不少问题。
  哦?什么问题?我们一起看下。
  经过两位的研究,实现详情以及注意事项总结为以下几个步骤:
  1.初始化outlineView并设置相关属性
  需要注意的是,outlineView必须放在scrollView上才可以显示,所以我们在初始化outlineView的时候,需要将outlineView作为scrollView的documentView展示。
  另外需要注意的一点是,ViewController中需要实现loadView方法。
  2.准备好用于展示的数据
  如果在项目中,数据可以通过model的形式从外部直接传过来,demo里我们就直接初始化。这里需要注意,outlinView需要的数据是一种类型的(父子节点数据是同种类型)。
  Demo中用到的model比较简略,只有NSString *name(用于展示的文案)和NSArray *childNodes(子节点)。
  3.根据需要自定义NSTableCellView
  除了自定义布局和样式,还需要在自定义的cellview中实现数据的展示:
  4.根据需要自定义NSTableHeaderCell
  类似于NSTableCellView,自定义样式和数据展示即可。
  5.在viewController中实现NSOutlineViewDataSource和NSOutlineViewDelegate的方法。
  下面介绍一下几个NSOutlineViewDataSource方法,根据需要选择性实现:
  1.每一层级节点包含的下一级节点的数量。
  2.每一层级节点的模型对象为item时,根据item获取子节点模型。item为nil空时表示获取顶级节点模型。
  3.节点是否可以打开/关闭。
  4.设置每个数据载体对应的具体数据,根据节点模型对象item,更新节点视图。 - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {    return item;}
  这个地方用于向自定义的cellView传递数据,如果return item.name,则那边接收到的"self.objectValue"就是item.name。
  5.展开的节点是否自动保存。
  - (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object ;
  6.自定义row。
  - (NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item ;
  下面是NSOutlineViewDelegate的几个方法:
  1.创建视图,更新item模型中数据到视图元素。 - (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {      OutlineItemCellView *cellView = [outlineView makeViewWithIdentifier:@"cellView" owner:nil];      if (cellView == nil) {          cellView = [[OutlineItemCellView alloc] init];          cellView.identifier = @"cellView";      }      return cellView;  }
  这里需要注意cellView一开始要复用是没有的,所以要初始化一下。storyboard实现outlineView不需要考虑,所以纯代码实现的时候容易忽略这点。
  2.是否绘制"组行"样式。 - (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item {      if (item && [item isKindOfClass:OutlineViewDataModel.class] && ((OutlineViewDataModel *)item).childNodes) {          return true;      }else {          return false;      }  }
  3.设置每一行的高度。
  - (CGFloat)outlineView:(NSOutlineView *)outlineView heightOfRowByItem:(id)item ;
  4.获取到选择节点后的通知。 - (void)outlineViewSelectionDidChange:(NSNotification *)notification ;
  这里可以获取点击节点的相关信息,根据需要作出相应处理。比如打印节点name: NSOutlineView *treeView = notification.object;  NSInteger row = [treeView selectedRow];  OutlineViewDataModel *model = (OutlineViewDataModel*)[treeView itemAtRow:row];  NSLog(@"name = %@",model.name);
  以上五步完成之后,运行程序大概是这个样子:
  如果我们想要自定义每行的背景色以及点击高亮色,该怎么做呢?
  可以在OutlineItemCellView中设置背景色试试。
  效果是这样的...
  因为左侧箭头那部分并不属于cellView,cellView的下面还有一层rowView。
  这个时候我们需要自定义NSTableRowView,在OutlineRowView中设置相应样式处理,并实现rowViewForItem方法,效果如下:
  以上是在探索纯代码实现NSOutlineView的学习过程中的一些小总结,希望大家不吝珠玉,给予补充或者提出建议,一起学习交流。
  作者:姚云丽

3WindowsServer2022服务器部署DNS域名解析服务1首先将服务器的IP地址设置为静态IP地址,IP地址根据自己情况来进行设置(1)在桌面右击网络图标并选择属性,然后进入网络共享中心(2)选择Ethernet,然后选择属性,接下来选最火的Web3社交平台Damus,一周就变成了互联网厕所Web3社交想从底层架构颠覆传统社交,但却忽略了人的因素。一切都发生的太快了。2月1日,Twitter联合创始人及前CEOJackDorsey发布推文表示,基于分布式社交媒体协议N2023年1月飞腾CPU与97款软件完成兼容适配IT之家2月11日消息,据飞腾发布,2023年1月,飞腾平台共与48家国内厂商的97款产品完成了兼容适配。整体包括安全类6款,操作系统3款,存储容灾备份3款,大数据2款,数据库2款华为国产化替代进展到哪一步了?转载微信公众号芯师爷日前,多家媒体报道称,拜登政府正收紧对华为的出口许可,一些美国企业近期的相关出口申请遭到拖延抑或事实性叫停。知情人士表示,美国正在考虑禁止美国供应商向华为提供任售价40。3万,续航可达1032km,还有3米轴距,极氪001自主品牌新能源已经发展得比较不错了,除了在中低端站稳脚跟,也在积极向上冲击市场。本期就给大家带来一台售价40。3万的自主品牌新能源车型,续航能达到1032km,这就是极氪ZEEKR阿达尼危机不断发酵,印度执政党却想甩锅中国,这将如何影响明年大选?文PrabhuMallikarjunan编辑漆菲印度总理纳伦德拉莫迪与印度阿达尼集团董事长高塔姆阿达尼的密切关系受到严格审视1月24日,美国投资公司兴登堡研究(Hindenburg交广会客厅不同的岗位一样的坚守2023年春运开始,随着疫情影响越来越小,旅客列车逐渐恢复运行,春运临客也陆续加开,大批旅客开启了回家之旅。为春运安全保驾护航,对于铁路人来说,这是一个不小的挑战,但也是每一名铁路机关事业单位退休的老中新人,养老金的计算与发放,差距有多大?8年前也就是2014年时,机关事业单位的养老保险制度,进行了新一轮的改革。在此之前退休的人,被称为老人,他们到手养老金的计算方式,按照之前的方式方法施行在2014年10月份之后参加国家财政危机不应由百姓埋单在一众的专家建议中,总算听到有个说为老百姓说话的专家,贾康说中国财政的缺口危机,不应该由老百姓来买单。以前一说起经济不行了,就有专家建议刺激消费,要从老百姓口袋里掏钱,他们觉得老百不只是教练,郑智被提拔,新岗位曝光,下赛季去向锁定从中超返回了中甲,八冠王广州男足或许没有想到自己还会经历这样的一天,而在广州男足降级之后,虽然恒大表示并不打算解散足球队,可是集团却无力给足球队提供更多的资金帮助,这也让广州男足也奥运冠军孙杨,31岁财富自由,不愁工作,女友是体操女神中国体坛有许多传奇运动员,他们天赋异禀,实力强大,在最高舞台上实现了统治。羽毛球的领军人物是林丹,乒乓球的领军人物是马龙,田径的领军人物是刘翔,游泳的领军人物则是孙杨。作为一个奥运
我用自己的语言带你初步认识shell,学不会算我输什么是shell你可以把shell看成是个壳子,它英文本身也是壳子的意思,我们通过这个壳子向内核传达指令。其实我们对shell并不陌生,甚至我们每天都在使用它。有点纳闷吧,听我解释微软有意打造超级应用,但真的有这个能力吗?诞生于2011年的微信最初仅仅只是一款即时通讯工具,但如今俨然成为了一个集社交资讯支付等诸多功能于一身的聚合体,并且不仅仅是微信,诸如QQ支付宝抖音快手美团这样的超级应用(Supe数链空间品牌联盟安泰信用评级海外经济要闻速递第二十九期本文作者数链空间品牌联盟成员单位安泰信用评级分析师李沐勋赵迪1欧洲央行管委12月应加息50个基点以抗击通胀获悉,欧洲央行管委会成员法国央行行长FrancoisVilleroydeG济南功能区管理精简高效激发经济发展新活力近日,在济南新旧动能转换起步区,总投资150亿元的比亚迪新能源乘用车及零部件产业园项目实现首台整车下线。这个项目主要建设冲压焊装涂装总装四大工艺厂房,我们全程提供保姆式服务,项目从海运市场担忧硬着陆,有船公司开始上调东南亚运价记者白帆编辑随着海运运价持续走低,业内普遍担忧市场面临硬着陆,班轮公司也积极采取各种措施,减缓运价下行。随着船公司加大力度控制运力,运价跌幅有所收敛。近日,OOCL东方海外开始上调身家超10亿牛散居然关联杀猪盘!屠文斌夫妇三季度持仓盘点屠文斌是宁波牛散中的代表人物,相当神秘低调,据传跟总舵主徐翔有着千丝万缕的联系。不过今天仓仓在查证资料的时候被吓了一跳,屠文斌居然和杀猪盘联系在了一起。仔细一看才知道,原来被杀的猪日本乒乓女王福原爱,和她背后的四个男人文微史解读编辑微史解读初恋遇人不淑,遭渣男劈腿头婚又碰上两面派丈夫,孕期被无情PUA转头结识第三任,却又陷入出轨知三当三的负面新闻中。提及日本乒乓一姐福原爱,最引人称道的除了赛场上保力新能源科技公司入驻阳春市南山工业园12月5日上午,阳春市保力新能源科技有限公司在阳春市南山工业园举行奠基仪式。阳春市副市长郑振汉及市府办市工信局等相关部门负责同志和公司负责人出席活动并共同剪彩奠基。据了解,阳春市保并购优塾新能源车增程式电动车,造车新势力跟踪理想VS赛力斯微信公众号并购优塾(moneyC2C)首发,更多文章可微信关注我们的公众号并购优塾产业链地图今天,我们要跟踪的是增程式电动车产业链。在新能源车型中,主要有纯电插混增程三大主流模式。新能源汽车的续航里程焦虑到底什么时候能解决?新能源车续航里程焦虑分以下几类情况冬季续航折扣缩水。春夏秋冬不同温度情况下,电池本身性能表现差异很大,加上空调制热耗能严重,冬季续航大打折扣。又焦虑续航又不敢开空调瑟瑟发抖双重暴击威少AD缺席比赛后改变了很多东西,我们无法终结比赛湖人在比赛中102116不敌骑士。赛后,湖人后卫拉塞尔威斯布鲁克接受了采访。被问及安东尼戴维斯的缺席对球队造成了怎样的影响,威少表示那改变了很多东西。我们努力待在比赛里,但就是无法