首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于视图的NSTableView只有在焦点改变时才会重新绘制

NSTableView 是 macOS 上的一个控件,用于显示和编辑表格数据。视图(View)是 macOS 应用程序中的一个基本概念,它负责显示内容并处理用户交互。NSTableView 可以使用基于视图的单元格(View-Based Cells),这意味着每个单元格都是一个独立的视图,而不是传统的单元格(Cell-Based Cells),后者是使用 NSCell 对象来表示的。

基础概念

  • 视图(View):在 macOS 中,视图是用户界面的基本构建块,负责显示内容并处理用户交互。
  • NSTableView:一个用于显示表格数据的控件,可以显示多行和多列的数据。
  • 基于视图的单元格(View-Based Cells):每个单元格都是一个独立的视图,可以自定义外观和行为。

相关优势

  1. 灵活性:基于视图的单元格提供了更高的灵活性,因为每个单元格都可以使用不同的视图,并且可以自定义其外观和行为。
  2. 性能:对于复杂的数据模型,基于视图的单元格通常比基于单元格的模型更高效,因为它们可以重用视图,减少了内存消耗。
  3. 可维护性:代码结构更清晰,易于维护和扩展。

类型

  • 静态视图:每个单元格都是一个固定的视图。
  • 动态视图:单元格视图可以根据数据模型动态创建和配置。

应用场景

  • 复杂的数据展示:当表格中的数据需要复杂的布局或自定义控件时。
  • 性能敏感的应用:对于需要高效渲染大量数据的场景。

遇到的问题及原因

问题描述:基于视图的 NSTableView 只有在焦点改变时才会重新绘制。

原因:

  • 视图重用机制NSTableView 使用视图重用机制来优化性能,这意味着它不会立即更新所有单元格,而是在需要时(例如焦点改变)才更新。
  • 数据绑定问题:如果数据模型没有正确地通知 NSTableView 数据已经改变,那么视图可能不会更新。

解决方法

  1. 确保数据模型发出通知: 确保你的数据模型在数据改变时发出适当的通知。例如,如果你使用 NSArrayController,它会自动处理这些通知。
  2. 确保数据模型发出通知: 确保你的数据模型在数据改变时发出适当的通知。例如,如果你使用 NSArrayController,它会自动处理这些通知。
  3. 手动强制更新: 如果数据模型没有自动通知,你可以手动调用 reloadDatareloadColumn 方法来强制 NSTableView 更新。
  4. 手动强制更新: 如果数据模型没有自动通知,你可以手动调用 reloadDatareloadColumn 方法来强制 NSTableView 更新。
  5. 使用 KVO(键值观察): 如果你需要更细粒度的控制,可以使用键值观察(KVO)来监听数据模型的变化,并在变化时更新视图。
  6. 使用 KVO(键值观察): 如果你需要更细粒度的控制,可以使用键值观察(KVO)来监听数据模型的变化,并在变化时更新视图。

通过以上方法,你可以确保 NSTableView 在数据改变时能够及时更新,而不仅仅是在焦点改变时。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

macOS开发之NSTableView的应用详解

NSTableView的应用详解 一、引言     和iOS开发中的UITableView有很大差别,NSTableView并非是一个可滚动的列表视图,其是一个不可滚动、支持多列多行的原始列表视图。...在OS X v10.6版本之前,NSTableView中行数据载体视图必须是NSCell的子类,之后版本的OS X支持开发者创建基于View的TableView视图,同样也支持基于Cell的TabelView...视图,在开发者,我们可以根据实际需求选择。...View的TableView视图     基于View-Base的TableView要比基于Cell的TableView更加灵活,其中每行数据载体可以是任意NSView的子类。...; //列宽度改变后发的通知 APPKIT_EXTERN NSNotificationName NSTableViewColumnDidResizeNotification; //选择改变时发的通知

4.8K21

Android视图状态及重绘流程分析,带你一步步深入了解View(三)

一般只有视图在focusable和focusable in touch mode同时成立的情况下才能成功获取焦点,比如说EditText。...那你可能会有疑问,在前面一篇文章中我们说到,任何一个视图的显示都要经过非常科学的绘制流程的,很显然,背景图的绘制是在draw()方法中完成的,那么为什么selectDrawable()方法能够控制背景图的改变呢...二、视图重绘 虽然视图会在Activity加载完成之后自动绘制到屏幕上,但是我们完全有理由在与Activity进行交互的时候要求动态更新视图,比如改变视图的状态、以及显示或隐藏某个控件等。...虽然经过了很多辗转的调用,但是可以确定的是,调用视图的invalidate()方法后确实会走到performTraversals()方法中,然后重新执行绘制流程。...而如果你希望视图的绘制流程可以完完整整地重新走一遍,就不能使用invalidate()方法,而应该调用requestLayout()了。

1.2K100
  • Android 自定义View小结(重于理解,不作为教程)

    ,所以layout_width和layout_height属性才会有效果。..., 在重写onMesure方法时,内部要调用setMeasuredDimension 方法之后,我们才可以调用getMeasuredWidth()和getMeasureHeight()来获取试图测量出的宽高..., 不可用的视图是无法响应onTouch事件的, 2.forcused 表示当前视图是否获得到焦点, 通常情况下有两种方法可以让视图获得焦点, 即通过键盘的上下左右键切换视图, 以及调用requestFocus...()方法,但是现在基本上没有带键盘的手机了, 因此只有一个请求焦点的方法了,而且requestfocus也不一定可以让视图获得焦点, 他会有一个布尔值的返回值, 如果返回true说明获取成功了, 返回false...说明获得焦点失败, 一般只有视图在focusable和 focusable in touch mode 同时成立的情况下才能成功的获取焦点,比如说,Edittext。

    33710

    自定义View必备知识-View绘制流程

    可以调用setEnable()方法来改变视图的可用状态,传入true表示可用,传入false表示不可用。 它们之间最大的区别在于,不可用的视图是无法响应onTouch事件的。...isFocused() 当前视图是否获得焦点 通常情况下有两种方法可以让视图获得焦点,即通过键盘的上下左右键切换视图,以及调用requestFocus()方法。...而requestFocus()方法也不能保证一定可以让视图获得焦点,它会有一个布尔值的返回值,如果返回true说明获得焦点成功,返回false说明获得焦点失败。...一般只有视图在focusable和focusable in touch mode同时成立的情况下才能成功获取焦点,比如说EditText。...parent中上下平移View的位置; offsetLeftAndRight直接改变的是left, right, 相当于在parent中左右平移View的位置; View的边界直接发生了变化,又因为View

    1.7K30

    Vcl控件详解_c++控件

    事件 OnAddition:添加一个新节点时触发 OnAdvancedCustomDraw:在绘制树状视图组件期间不同阶段触发 OnAdvancedCustomDrawItem:在绘制树状视图的新节点期间的不同阶段触发...Columns:对列进行操作 DropTarget:可列表视图中项目是否以拖放操作的目标显示 FlatScrollBars:是否让滚动条有平滑的效果 FullDrag:当标签拖动时,是否重新绘制...:在绘制组件子项目期间的不同状态触发 OnChange:当列表中的项目改变时触发 OnChanging:当列表中的项目正在改变时触发 OnColumnClick:当单击列时触发 OnColumnDragged...该事件只有在OwnerData属性为True时才有效 OnDataHint:当列表视图的内容变化(如用户滚动列表视图)时发生 OnDataStateChange:当项目的范围改变状态时发生。...该事件只有在OwnerData属性为True时有效 OnDeletion:当列表视图中的一个项目被删除时触发 OnDrawItem:当绘制一个项目时触发 OnEdited:当编辑一个项目的Caption

    4.9K10

    Jekyll-Admin-Mac 开发纪要-左侧菜单栏

    我的试图已经能随着变化自动改变高度了。 这个时候我们还发现了一个问题,我们的 Window可以压缩宽度最小,这样左边的侧栏已经挡着了。...试图依次叠加不利于扩展,我们采用 NSTableView。 我们拖拽一个 NSTableView的控件放置在 SideMenuView剩余的位置。布局如下。 ? ?...我们发现我们剩下的只有一个 Column的宽度只有 116并不是全屏显示的。 去掉 NSTableView的边框 我们设置宽度为 205。 ? 我们现在发现了一个问题,我们本来有205的宽度的。...我们在 NSTableView的属性里面看到这个。 ? 我们的宽度留3大小。但是就算去掉了3还是只有 203,剩下的 2跑到那里去了。...我们发现我们刚才创建的 NSTableView显示的背景颜色是白色的,我们可以关闭 NSScrollView的绘制背景颜色和设置 NSTableView的背景颜色为透明即可。 ?

    2.1K10

    CListBox

    列表框显示项的列表,如用户可以见到和选择的文件名称。在单选列表框里,用户只可选择一个项。在多选列表框里,可选择许多项。当用户选择某项时,其高亮显示且列表框给父窗口发送一个通知消息。   ...只有LBS_NOTIFY风格的列表框才会发送此通知消息。  ON_LBN_ERRSPACE 列表框不能重新分配足够的内存来满足请求。 ...ON_LBN_KILLFOCUS 列表框正失去输入焦点。  ON_LBN_SELCANCEL 当前列表框选择被取消。此消息只有在列表框是LBS_NOTIFY风格时才发送。 ... SetSel 在多选列表框中选择或不选某个列表框项  GetCaretIndex 确定在多选列表框中有焦点矩形的项的索引  SetCaretIndex 设置焦点矩形到多选列表框中的指定的索引项 ...当自绘制列表框的一个可视部分改变时,被框架调用  MeasureItem 当自绘制列表框创建时,被框架调用来确定列表框维数  CompareItem 被框架调用以确定一系列列表框中某新项的位置

    1.4K80

    Android View架构总结

    Android视图,是类似于Dom树的架构。父视图负责测量定位绘制等操作。...绘制从根视图开始,从上至下遍历整棵视图树,每一个ViewGroup负责让自己的子View被绘制,每一个View负责绘制自己,通过draw()方法.绘制过程分三步走。...//最外层的根视图的widthMeasureSpec和heightMeasureSpec由来 //lp.width和lp.height在创建ViewGroup实例时等于MATCH_PARENT...确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。...特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。 invalidate:View本身调用迫使view重画。是在UI线程自身使用。

    1.1K60

    Android中文API——ScrollView

    TextView类也有自己的滚动功能,所以不需要使用ScrollView,但是只有两个结合使用,才能保证显示较多内容时候的效率。但只有两者结合使用才可以实现在一个较大的容器中一个文本视图效果。...参数 canvas 绘制视图的画布 public boolean executeKeyEvent (KeyEvent event) 当接收到key事件时,用户可以调用此函数来使滚动视图执行滚动,类似于处理由视图体系发送的事件...public void requestLayout () 当有改变引起当前视图重新布局时,调用此函数。它将规划一个视图树的layout路径。...只有当视图可以滚动时,此项设置才起作用。 (译者注:这个函数是2.3 r1 中新增的,API Level 9。... (int direction, Rect previouslyFocusedRect) 当在滚动视图的子视图中查找焦点视图时,需要注意不要将焦点设置在滚动出屏幕外的控件上。

    4.6K30

    游戏优化系列三:Unity游戏的黑屏问题解决方法

    原activity仍然是失去焦点的状态(如果没有手动重新获取焦点),当前页面显示黑屏。...onStart ():在活动创建方法onCreate(Bundle)或重新启动方法onRestart()之后调用,开始绘制视图、动画等,呈现给用户,其后一般调用onResume()。...在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。...首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。...如果根据第二点添加获取焦点方法后,由下图可以看到继续执行的unity脚本生命周期方法,先获取到焦点、中止pause状态并绘制页面进行正常显示。即工程重新获取焦点后才会绘制图像。

    6.2K01

    Android6.0源码分析之View(一)

    0或者第三个参数没有在主题属性中定义时该参数才会起作用。...来给view,自定义的style可以通过context获取到resource资源获取,但是这个只有在主题中没有定义样式资源这个属性或者样式资源这个属性为0时才会起作用 添加view的方法 可以在代码中动态添加方法.../drawingHeight,绘制的宽高(getWidth/height):定义了在layout结束后在draw绘制时view在屏幕上所显示的真是的宽高,这组值有可能与第一组值不同。...当开始动画后,framework会按照动画要求对view进行重新绘制,直到动画结束。...的焦点发生改变时触发 onKeyListener:当有按键事件会触发 onLongClickListener:长按时触发 onTouchListener:触摸时触发

    93580

    【QT】图形视图、动画框架

    图形视图框架提供了基于图像项模型的模型视图编程方法,主要由场景、视图和图形项这三部分组成,这三部分分别由QGraphicsScene、QGraphicsView、QGraphicsItem这三个类来表示...场景绘制顺序:背景层->图像项层->场景层 场景作用: 提供用于管理大量图像项的高速接口; 传播事件到每一个图形项; 管理图像项的状态,如选择和处理焦点; 提供无变换的渲染功能,主要用于打印; 常用接口...如果没有图像项,则为顶层图像项,其均会在场景的坐标系统中。 所有的图像项都会使用确定的顺序来进行绘制,这个顺序也决定了单机场景时哪个图像项会先获得鼠标的输入。...视图的坐标 视图的坐标就是部件的坐标,视图坐标的每一个单位对应一个像素,原点总是在QGraphicsView视口的左上角,而右下角是宽高。所有的鼠标事件和拖放事件都是使用视图坐标来接收的。...一个图像项可以接收悬停事件,当鼠标进入它的区域之中时,它就会收到一个QGraphicsSceneHoverEnter事件,鼠标在图像项的区域移动时,QGraphicsScene就会向该图像项发送GraphicsSceneHoverLeave

    1.6K30

    vue要点记录(待更新)

    Vue实例 每个 Vue 实例都会代理其 data 对象里所有的属性:vm.a===data.a //true 注意只有这些被代理的属性是响应的。...如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。 除了 data 属性, Vue 实例暴露了一些有用的实例属性与方法。这些属性与方法都有前缀 $,以便与代理的 data 属性区分。...computed Computed vs Methods 计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。...对象迭代 item in object,在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下是一致的。 整数迭代 n in 10。...v-model修饰符 不加.lazy就是在input中输入或退格,对应的数据就跟着改变(input事件); 加.lazy就是当输完后,input失去焦点时,对应数据进行改变(change事件)。 ?

    1.4K30

    View三问—斗鱼真题

    所以主要有以下三个方法来获取view的宽高: view.post()方法 在该方法里的runnable对象,能保证view已经绘制完成,也就是执行完measure、layout和draw方法了。...,所以Activitiy获取焦点时,view肯定绘制完成了,这时候获取宽高也是没问题的: @Override public void onWindowFocusChanged(boolean...OnGlobalLayoutListener的作用是当View树的状态发生改变或者View树中某view的可见性发生改变时,OnGlobalLayoutListener的onGlobalLayout方法将会被回调...performDraw(); } 可以看到在performTraversals方法中执行了,但是在view绘制之前,这是因为在绘制之前就把需要执行的runnable封装成Message发送到MessageQueue...其实就是当前的这个performTraversals所在的任务,所以要等下面的·performMeasure,performLayout,performDraw·都执行完,也就是view绘制完毕了,才会去执行之前我们

    58420

    Spread for Windows Forms高级主题(8)---通过暂停布局提高性能

    使用布局对象的目的是,通过保存绘制控件过程所使用已计算好的布局值,每次控件重画时重新使用它们而不是每次都进行重算,来优化控件的绘制。...当跟踪到一个需要重新生成布局对象的改变发生时,绘制代码就会丢弃现有的布局对象,并计算出一个新的对象。...在绘制控件过程中,如果发生未被捕捉的异常,通知就会出现,并且在异常发生时布局也会被暂停。 ?...这些只会在使用SuspendLayout方法暂停布局时才会发生,然后对控件状态所做的改变也会生效,控件也会以某种方式使用非法的布局对象进行再次绘制。...对行或列进行重新排列时,如排序和过滤,肯定需要重计算,但设置文本只有在某些情况下才需要重计算,例如,当你将AllowCellOverflow属性打开时。

    1.8K60

    我的2017年总结笔记整理

    而 android:clipToPadding 这个属性作用就是允许绘制在 padding 内子控件,这个属性默认值是 true,当我们把它设置成 false 后,子控件在父控件的 padding 区域内就可以显示出来了...,以此类推 (3)xml焦点控制 android:descendantFocusability-----父容器和子控件的焦点获取问题 这个属性定义了当一个焦点要传递给父容器或者子控件时,父容器和子控件之间获得焦点的关系...具体值如下: beforeDescendants:父容器会比其子控件率先获得焦点。 afterDescendants:如果没有任何子控件要获得焦点的话,那么父容器才会获得焦点。...Q2:在这个过程中,为什么当 RecyclerView 再次向上滑动重新显示第一行的5个卡位时,只有后面3个卡位触发了 onBindViewHolder() 方法,重新绑定数据呢?...5个卡位只有3个卡位需要重新绑定数据,有时却又5个卡位都需要重新绑定数据,这是为什么呢?

    758110

    Python Qt GUI设计:5种事件处理机制(提升篇—3)

    事件处理机制本身很复杂,是PyQt底层的知识点,当采用信号与槽机制处理不了时,才会考虑使用事件处理机制。...比如可以改变它的行为:在鼠标按键按下时触发clicked信号,而不是在释放时。 1、常见事件类型 Qt事件的类型有很多,常见的Qt事件如下所示: 键盘事件:按键按下和松开。...绘屏事件:重绘屏幕的某些部分。 定时事件:定时器到时。 焦点事件:键盘焦点移动。 进入和离开事件:鼠标指针移入Widget内,或者移出。 移动事件::Widget的位置改变。...在2.1、重新实现事件函数例子中补充以下代码,实现重新定义: '''重新实现其他事件,适用于PyQt没有提供该事件的处理函数的情况,Tab键由于涉及焦点切换,不会传递给keyPressEvent...QApplication的notify()方法 PyQt使用notify()来分发事件,要想在任何事件处理器之前捕获事件,唯一的方法就是重新实现QApplication的notify(),在实践中,在调试时才会使用这种方法

    2.3K30
    领券