10. NSTableView Table 数据表格
表格是非常重要和复杂的一个控件,本节会用大量篇幅来把表格这东西力求讲清楚。
基本设置
表格结构
表格是 OS X 组件中为数不多采用了MVC设计模式来实现的控件,即tableView–dataSource–Delegate,这种分层架构给处理数据带来了极大的便利性。先了解下表格的组成,如下:
- NSTableView:由NSTableHeaderView + NSTableRowView组成;
- NSScrollView:NSScrollView包装了NSTableView,它和NSTableView构成了最外围的对象,NSTableRowView 的视图由NSScrollView来管理;
- NSTableHeaderView:为表头,由一组 NSTableHeaderCell 组成;
- NSTableRowView:表示内容区,由一组 NSTableCellView组成;
- NSTableViewDataSource:由多个NSTableColumn(即列视图)来定义;NSTableRowView 的数据由NSTableViewDataSource来定义,NSTableViewDataSource定义了一系列的显示回调方法;
- NSTableViewDelegate:NSTableRowView 的代理由NSTableViewDelegate来定义,它提供了数据加载时的回调方法;
以下是UI的层级结构:
table 属性
- content mode:设置table的cell模式,推荐使用view-based,cell-based是一种老设计;
- columns:表示表格有多少列;
- header:是否显示表头;
- horizontal grid和 vertical grid:是否显示表格线;
- background color:单元格背景色;
- selection:是否允许行多选;
column 属性
- title:标题;
- state:是否可以编辑列名称;
- identifer:列的唯一标识符,用于在数据源和代理回调中使用;
- Table Cell View 的identifer:用于数据量大时可从缓存中获取可复用的cell单元视图,用于性能优化;
设置表格外观
主要是颜色等外观样式
@IBOutlet weak var tableView: NSTableView!func tableStyleConfig() {//表格网格线设置self.tableView.gridStyleMask = [NSTableView.GridLineStyle.dashedHorizontalGridLineMask,NSTableView.GridLineStyle.solidVerticalGridLineMask]//表格背景self.tableView.backgroundColor = NSColor.white//背景颜色交替self.tableView.usesAlternatingRowBackgroundColors = true//表格行选中样式self.tableView.selectionHighlightStyle = .regular}
表格数据绑定
以下是三种表格数据绑定方法,推荐第二种方式。
Cell-Based表格数据
-
首先修改 Table View 的Content Mode 为Cell Based;
-
选择column,修改identifier,与程序代码中数据定义相匹配(参考下边代码示例);
-
可以往单元格中添加不同的 cell,注意是cell而不是控件,这样就可以实现表格中的个性化展示了,如下图:
-
设置TableView的Deletegate和DataSource为默认的View Controller,拖动下图红框到UI导航的View Controller上面;
也可以通过代码设置self.tableView.delegate = self
和self.tableView.dataSource = self
-
定义表格数据,下面的updateData方法是自定义的,需要调用:
//表格数据,这个datas属性会在协议实现时再加载使用var datas = [NSDictionary]()func updateData() {self.datas = [["name":"john","address":"USA","gender":"male","married":(1)],["name":"mary","address":"China","gender":"female","married":(0)],["name":"park","address":"Japan","gender":"male","married":(0)],["name":"Daba","address":"Russia","gender":"female","married":(1)],]}
- 扩展协议,加载数据
extension ViewController: NSTableViewDataSource {//返回表格数据行数func numberOfRows(in tableView: NSTableView) -> Int {return self.datas.count}//正常只读显示func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {let data = self.datas[row]//表格列的标识let key = tableColumn?.identifier//单元格数据let value = data[key!]return value}
}
View-Based表格数据(推荐)
- 首先修改 Table View 的Content Mode 为View Based;
- 选择column,修改identifier,与数据相匹配;(同上)
- 可以往单元格中添加不同的控件,注意是控件而不是cell,这样就可以实现表格中的个性化展示了:
- 设置TableView的Deletegate和DataSource为默认的View Controller;(同上)
- 定义表格数据(同上)
- 扩展协议,加载数据,要实现两个协议
extension ViewController: NSTableViewDataSource {func numberOfRows(in tableView: NSTableView) -> Int {return self.datas.count}
}extension ViewController: NSTableViewDelegate {func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {let data = self.datas[row]//表格列的标识let key = (tableColumn?.identifier)!//单元格数据let value = data[key]//根据表格列的标识,创建单元视图let view = tableView.makeView(withIdentifier: key, owner: self)let subviews = view?.subviewsif (subviews?.count)!<=0 {return nil}if key.rawValue == "name" || key.rawValue == "address" {let textField = subviews?[0] as! NSTextFieldif value != nil {textField.stringValue = value as! String}}if key.rawValue == "gender" {let comboField = subviews?[0] as! NSComboBoxif value != nil {comboField.stringValue = value as! String}}if key.rawValue == "married" {let checkBoxField = subviews?[0] as! NSButtoncheckBoxField.state = NSControl.StateValue(rawValue: 0)if (value != nil) {checkBoxField.state = NSControl.StateValue(rawValue: 1)}}return view}}
Bindings 表格数据
- 添加ArrayControl 控件,然后绑定到View Controller的一个变量中;
实现代码如下:
import Cocoaclass ViewController: NSViewController {override func viewDidLoad() {super.viewDidLoad()updateData()}override var representedObject: Any? {didSet {// Update the view, if already loaded.}}dynamic var datas = [NSDictionary]()func updateData() {self.datas = [["name":"john","address":"USA"],["name":"mary","address":"China"],["name":"park","address":"Japan"],["name":"Daba","address":"Russia"],]}
}
- 添加一个NSTableView控件,设置tableColumn的identifier和上面的datas名称一样;
- 表格列绑定到Array Controller,Model Key Path可以省略;
- 单元格绑定到Model key path,选顶中的objectValue表示当前的行数据;
动态编辑表格
协议实现
表格的操作,需要实现NSTableViewDataSource
协议方法,否则无法保存数据:
//动态编辑表格使用func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int) {let data = self.datas[row]//表格列的标识let key = tableColumn?.identifierlet editData = NSMutableDictionary.init(dictionary: data)editData[key!] = objectself.datas[row] = editData}
添加和删除行
@IBAction func addTableRow(_ sender: NSButton) {let data = NSMutableDictionary()data["name"] = ""data["address"] = ""//增加数据到datas数据区self.datas.append(data)//刷新表数据self.tableView.reloadData()//定位光标到新添加的行self.tableView.editColumn(0, row: self.datas.count-1 , with: nil, select: true)}@IBAction func deleteTableRow(_ sender: NSButton) {//表格当前选择的行let row = self.tableView.selectedRow//如果row小于0表示没有选择行if row<0 {return}//从数据区删除选择的行的数据self.datas.remove(at: row)//刷新表数据self.tableView.reloadData()}
表格行拖放
- 注册一个自定义事件;
- 实现 NSTableViewDataSource 把表格行号数据拷贝到剪切板对象中;
- 实现 NSTableViewDataSource 把表格行号数据复制到表格对象中;
//注册拖放事件,事件为一自定义的值
let kTableViewDragDataTypeName = "TableViewDragDataTypeName"
self.tableView.register(forDraggedTypes: [kTableViewDragDataTypeName])
实现协议方法
func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {//将表格行号拷贝到剪切板对象中let zNSIndexSetData = NSKeyedArchiver.archivedData(withRootObject: rowIndexes);pboard.declareTypes([kTableViewDragDataTypeName], owner: self)pboard.setData(zNSIndexSetData, forType: kTableViewDragDataTypeName)return true}func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {let pboard = info.draggingPasteboard()let rowData = pboard.data(forType: kTableViewDragDataTypeName)let rowIndexes = NSKeyedUnarchiver.unarchiveObject(with: rowData!) as! NSIndexSetlet dragRow = rowIndexes.firstIndexlet temp = self.datas[row]self.datas[row] = self.datas[dragRow]self.datas[dragRow] = temptableView.reloadData()return true}
表格事件
定义表格常见的一些操作事件
数据选取
以下是表格行和列的选取方法,采用(X,Y)坐标系的方式:
let row = self.selectedRowlet col = self.selectedColumn
行单击事件
需要实现 NSTableViewDelegate 协议中的方法,不需要设置绑定
func tableViewSelectionDidChange(_ notification: Notification){let tableView = notification.object as! NSTableViewlet row = tableView.selectedRowprint("selection row \(row)")}
行双击事件
动态添加事件。
//表格双击事件self.tableView.doubleAction = #selector(ViewController.doubleAction(_:))@IBAction func doubleAction(_ sender: AnyObject ) {let row = self.tableView?.selectedRowprint("double selection row \(row!)")}
表格右键菜单
- 拖动一个NSMenu到设计面板;
- 绑定menu对象到ViewController中;
- 实现NSMenuDelegate协议
@IBOutlet weak var tableMenu: NSMenu!
//表格菜单
self.tableView.menu = self.tableMenu
self.tableView.menu?.delegate = self
实现协议
//表格上下文菜单协议
extension ViewController: NSMenuDelegate {func menuNeedsUpdate(_ menu: NSMenu) {menu.removeAllItems()NSLog("menu clicked !")}}
不同菜单的写法
import Cocoaclass MyTableView: NSTableView {var menu1: NSMenu?var menu2: NSMenu?override func menu(for event: NSEvent) -> NSMenu? {let row = self.selectedRowlet col = self.selectedColumnif (row == 0 && col == 1) {return self.menu1}return self.menu2}
}
表格排序
点击列头时出现排序升降箭头指示,其算法也可以自定义,在表格初始化后,可调用一次以下几个方法之一;
//表格排序func tableSortConfig() {for tableColumn in self.tableView.tableColumns {//升序排序let sortRules = NSSortDescriptor(key: tableColumn.identifier.rawValue, ascending: true)tableColumn.sortDescriptorPrototype = sortRules}}func tableSortConfig2() {for tableColumn in self.tableView.tableColumns {//升序排序 使用字符串标准的比较函数let sortRules = NSSortDescriptor(key: tableColumn.identifier.rawValue, ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))tableColumn.sortDescriptorPrototype = sortRules}}func tableSortConfig3() {for tableColumn in self.tableView.tableColumns {//升序排序let sortRules = NSSortDescriptor(key: tableColumn.identifier.rawValue, ascending: true, comparator:{ s1,s2 inlet str1 = s1 as! Stringlet str2 = s2 as! Stringif str1 > str2 {return .orderedAscending}if str1 < str2 {return .orderedDescending}return .orderedSame})tableColumn.sortDescriptorPrototype = sortRules}}
编码实现
其实就是按步骤创建下列元素。
下面的代码需要完成以下界面效果
创建表格元素
基本元素定义
//1、定义表格对象和滚动条对象,最外层对象let tableView = NSTableView()let tableScrollView = NSScrollView()//2、定义存储表格数据的变量var datas = [NSDictionary]()
其组装过程大概如下:
//3、组装表格override func viewDidLoad() {super.viewDidLoad()//创建表格列self.tableViewConfig()//配置滚动条视图self.tableScrollViewConfig()//设置滚动条自动布局self.autoLayoutConfig()//加载更新数据self.updateData()}
创建表头
func tableViewConfig() {self.tableView.focusRingType = .none//self.tableView.autoresizesSubviews = trueself.tableView.delegate = selfself.tableView.dataSource = selflet column1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "name"))column1.title = "name"column1.width = 80column1.maxWidth = 100column1.minWidth = 50self.tableView.addTableColumn(column1)let column2 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "address"))column2.title = "address"column2.width = 80column2.maxWidth = 100column2.minWidth = 50self.tableView.addTableColumn(column2)}
设置滚动条样式
这块可有可无
func tableScrollViewConfig() {self.tableScrollView.hasVerticalScroller = trueself.tableScrollView.hasVerticalScroller = falseself.tableScrollView.focusRingType = .noneself.tableScrollView.autohidesScrollers = trueself.tableScrollView.borderType = .bezelBorderself.tableScrollView.translatesAutoresizingMaskIntoConstraints = falseself.tableScrollView.documentView = self.tableViewself.view.addSubview(self.tableScrollView)}
设置布局
此处建议,使用了自动化布局窗口辅助,此处使用的是Masony,但如果用swiftui需要引入三方包
func autoLayoutConfig() {let topAnchor = self.tableScrollView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0)let bottomAnchor = self.tableScrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0)let leftAnchor = self.tableScrollView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0)let rightAnchor = self.tableScrollView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0)NSLayoutConstraint.activate([topAnchor, bottomAnchor, leftAnchor, rightAnchor])}
初始化数据
更新数据同时,需要实现表格代理协议
func updateData() {self.datas = [["name":"john","address":"USA"],["name":"mary","address":"China"],["name":"park","address":"Japan"],["name":"Daba","address":"Russia"],]self.tableView.reloadData()}
实现NSTableViewDelegate协议
这里有很多方法可以按需定义
extension ViewController: NSTableViewDelegate {func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {let data = self.datas[row]//表格列的标识let key = (tableColumn?.identifier)!//单元格数据let value = data[key]//根据表格列的标识,创建单元视图var view = tableView.makeView(withIdentifier: key, owner: self)if view == nil {let cellView = NSTableCellView()cellView.identifier = identifier;view = cellViewlet textField = NSTextField()textField.translatesAutoresizingMaskIntoConstraints = falsetextField.isBezeled = falsetextField.drawsBackground = falsecellView.addSubview(textField)let topAnchor = textField.topAnchor.constraint(equalTo: cellView.topAnchor, constant: 0)let bottomAnchor = textField.bottomAnchor.constraint(equalTo: cellView.bottomAnchor, constant: 0)let leftAnchor = textField.leftAnchor.constraint(equalTo: cellView.leftAnchor, constant: 0)let rightAnchor = textField.rightAnchor.constraint(equalTo: cellView.rightAnchor, constant: 0)NSLayoutConstraint.activate([topAnchor,bottomAnchor,leftAnchor, rightAnchor])}let subviews = view?.subviewsif (subviews?.count)!<=0 {return nil}let textField = subviews?[0] as! NSTextFieldif value != nil {textField.stringValue = value as! String}return view}func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {return 30}}
相关文章:
10. NSTableView Table 数据表格
表格是非常重要和复杂的一个控件,本节会用大量篇幅来把表格这东西力求讲清楚。 基本设置 表格结构 表格是 OS X 组件中为数不多采用了MVC设计模式来实现的控件,即tableView–dataSource–Delegate,这种分层架构给处理数据带来了极大的便利…...
javase笔记8---File与IO流
File类型 简介 在程序中,使用java.io.File这个类来描述和操作磁盘上的一个文件或文件夹(目录)。 File这个类,能新建、删除、移动,重命名文件或文件夹,也能获取或者修改文件或文件夹的信息(如大小,修改时间等)…...
docker上传离线镜像包到Artifactory
docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁,最近国内资源也出现无法拉取的问题,Artifactory在生产环境中,很少挂外网代理去官方源拉取,小编提供…...
【专用名词的离线语音识别在2024年底的解决方法调查-会议签到的补充】
语音识别在会议点名中的使用 概要解决问题的过程不行的一些参考可以的一个package自定义词语的拼音转换遗留的问题 小结 概要 提示:这里可以添加技术概要 这里只实现一个方面,每个android会议设备都可通过语音发送参会者姓名,自动转换成文字添加到人员名单. 语音采集…...
OS基础-
OS基础 内存管理 内核用户设备管理 设备框架I/O子系统网络多媒体 音频视频运维 控制台GUIdebug审计计算机组成 CPU ALUregister SPLRPCR0-R12CPSRcacheclockInterrupt Vector tableIVTRMMU/MPU 内存访问权限配置,支持多进程BUSMEMORYI/O单线程 特点:结构…...
《大型语言模型实战指南:应用实践与场景落地》一文详解大型语言模型的11种微调方法
导读:大型预训练模型是一种在大规模语料库上预先训练的深度学习模型,它们可以通过在大量无标注数据上进行训练来学习通用语言表示,并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大,微调和推理阶段的资源消耗也在增加。…...
嵌入式浏览器 -- Chromium VS Firefox
嵌入式浏览器概念 嵌入式浏览器是嵌入式系统中的核心组件之一,用于为设备提供网络访问能力和内容显示功能。与传统PC浏览器相比,嵌入式浏览器更加注重性能优化和资源效率,同时确保核心功能可用,如HTML渲染、JavaScript支持和多媒…...
权限大、数量多、破坏强、管理难......企业特权访问管理怎么管?
特权账号,通往企业数据大门的“钥匙”。 它权限大,具有高危命令或操作的执行权限; 破坏性强,操作可能影响他人使用或其他系统故障; 信息泄露风险大,操作可能获取别人或其他系统相关隐私信息;…...
UE5 第一人称示例代码阅读0 UEnhancedInputComponent
UEnhancedInputComponent使用流程 我的总结示例分析firstthenand thenfinally&代码关于键盘输入XYZ 我的总结 这个东西是一个对输入进行控制的系统,看了一下第一人称例子里,算是看明白了,但是感觉这东西使用起来有点绕,特此梳…...
如何在Linux下安装和配置Docker
文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …...
apisix的原理及作用,跟spring cloud gateway有什么区别?
apache APISIX 是一个高性能、可扩展的开源 API 网关,它主要用于处理 API 请求、流量管理、安全控制和服务治理。APISIX 可以将复杂的服务架构中的不同服务通过统一的网关来进行管理和监控,为微服务架构提供了便捷的流量入口管理方式。 APISIX 的原理 …...
华为HarmonyOS实现实时语音识别转文本
场景介绍 将一段音频信息(短语音模式不超过60s,长语音模式不超过8h)转换为文本,音频信息可以为pcm音频文件或者实时语音。 开发步骤 在使用语音识别时,将实现语音识别相关的类添加至工程。 import { speechRecogni…...
DIY可视化-uniapp悬浮菜单支持拖动、吸附-代码生成器
在Uniapp中,悬浮菜单支持拖动和吸附功能,可以为用户带来更加灵活和便捷的操作体验。以下是对这两个功能的详细解释: 悬浮菜单支持拖动 提高用户体验:用户可以根据自己的需要,将悬浮菜单拖动到屏幕上的任意位置&#x…...
HTTP cookie 与 session
一.Cookie 定义: 是服务器发送到用户浏览器并保存在浏览器上的一小块数据, 它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上。 通常, 它用于告知服务端两个请求是否来自同一浏览器, 如保持用户的登录状态、 …...
智慧停车场导航系统架构及反向寻车系统解决方案
一、系统概述: 随着当前室内定位导航技术在大型公共场所如政务中心、商业综合体、车站中的应用越来越多,人们对智慧停车场的需求也日益凸显出来,并且智慧停车场对大型公共场所智慧化的整体建设起到重要作用。如何更有效提高停车效率…...
【小程序上传图片封装2024,支持多图,带进度,上传头像】
import config from ./config;// 支持多图,显示进度 export function uploadImages(count 1, sourceType, onLoading null, showProgress false, fileKey file) {return new Promise((resolve, reject) > {wx.chooseMedia({count: count, // 可以选择的图片数…...
[A-14]ARMv8/ARMv9-Memory-内存模型的类型(Device Normal)
ver0.1 [看前序文章有惊喜。] 前言 前面花了很大的精力把ARM构建的VMSA中的几个核心的议题给大家做了介绍,相信大家已经能够理解并掌握ARM的内存子系统的工作原理大致框架。接下来我们会规划一些文章,对ARM内存子系统的一些细节做一下介绍,使ARM的内存子系统更加的丰满。本…...
驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)
驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#…...
@Mapper使用中遇到的问题解法汇总
最近终于有时间写点代码相关的文章了,工作真的太忙了,果然又要测试又要开发的人最🐂🐴。 1.查询数据库有数据,但是代码中写select语句的时候查出为null Select("SELECT * FROM xx_manager order by id limit 1&q…...
深度学习:YOLO V3 网络架构解析
引言 YOLO V3(You Only Look Once Version 3)是YOLO系列算法的第三个版本,相比之前的版本,它在多个方面进行了优化和改进,不仅提升了检测精度,还保持了较快的检测速度。本文将详细介绍YOLO V3的主要改进以…...
SpringCloudAlibaba-Sentinel-熔断与限流
版本说明 <spring.boot.version>3.2.0</spring.boot.version> <spring.cloud.version>2023.0.0</spring.cloud.version> <spring.cloud.alibaba.version>2023.0.1.2</spring.cloud.alibaba.version>是什么 能干嘛 面试题 服务雪崩 安装使…...
mysql中的mvcc理解
是什么:MVCC指的是在读已提交、可重复读这两种隔离级别下的事务在执行普通的select操作时,访问记录的版本链的过程,可以使不同事务的读写操作并发执行,提高性能。 MVCC 隐藏字段 undo log 版本链 ReadView 1.隐藏字段…...
ETF申购赎回指南:详解注意事项与低费率券商推荐!
ETF 申购&赎回 ETF申购赎回是个啥业务? 01 ETF申购、赎回是一种交易委托方式,指投资者通过申购方式(买入方向)获得ETF份额,通过赎回的方式(卖出方向)换掉/卖出ETF份额。ETF申购,通常是通过一篮子成…...
List<T>属性和方法使用
//author:shark_ddd using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//使用函数来减少长度namespace List_T {class Student{public string Name { get; set; }public int Age { get; set; …...
记一次:使用使用Dbeaver连接Clickhouse
前言:使用了navicat连接了clickhouse我感觉不太好用,就整理了一下dbeaver连接 0、使用Navicat连接clickhouse 测试连接 但是不能双击打开,可是使用命令页界面,右键命令页界面,然后可以用sql去测试 但是不太好用&#…...
Java面向对象编程进阶(四)
Java面向对象编程进阶(四) 一、equals()方法的使用二、toString()方法的使用三、复习 一、equals()方法的使用 适用性:任何引用数据都可以使用。 自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的…...
【51单片机】第一个小程序 —— 点亮LED灯
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 单片机介绍LED灯介绍练习创建第一个项目点亮LED灯LED周期闪烁 单片机介绍 单片机,英文Micro Controller Unit࿰…...
如何通过自动化有效地简化 Active Directory 操作?
我们都知道规模稍微大一点的企业为了便于计算机的管理,基本都上了微软的AD域控制器。 那么肯定就会存在这么一个问题, 不断的会有计算机加入或者是退出域控制器,批量的创建、修改、删除AD域用户,如果企业的架构需要改变ÿ…...
Java-POI导出EXCEL(动态表头)
1、主要功能 导出excel,表头有固定的和动态的。动态表头之间不能穿插固定表头。 2、使用方法 引入下方两个工具类,定义excel固定表头类。调用方法即可。 调用方法: ExcelDynamicHeader<MajorNameChangeReport> ledgerSafetyProblemEx…...
利用 Direct3D 绘制几何体—9.流水线状态对象
到目前为止展示过编写输入布局描述、创建顶点着色器和像素着色器,以及配置光栅器状态组这 3 个步骤。接下来讲如何将这些对象绑定到图形流水线上,用以实际绘制图形。大多数控制图形流水线状态的对象被统称为流水线状态对象(Pipeline State Ob…...
wordpress 简单主题/视频剪辑培训班
更换gcc编译器可以解决 -D CMAKE_C_COMPILER/usr/bin/gcc-4.8转载于:https://www.cnblogs.com/gabrialrx/p/9001554.html...
中华人民共和国建设厅官方网站/网络营销与策划试题及答案
从效率考虑:cookie > memcache > 数据库cookie对服务器端负载没影响,如果加密、解密会多消耗一点点cpu。带宽倒是会消耗得多一点,同域名下的所有http request header都会附带cookie,所以在大流量下,把js、css、图…...
赤峰做网站开发/seoul是韩国哪个城市
nginx是什么? nginx是俄罗斯人 Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的一个十分轻量级的HTTP服务器。它是一个高性能的HTTP和反向代理服务器,同时也可以作为IMAP/POP3/SMTP的代理服务器。nginx使用的是BSD许可。 Nginx 以事件驱动的方式…...
如何个人电脑做网站/优化是什么意思
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是Java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?…...
网站开发什么语言比较好/色盲测试图第五版
之企业库推广 阿新 1. 概述 可重用的程序块库,用于解决共性的企业级开发过程中所面临的挑战 l 较低风险(经过实践验证的、精准的) l 降低成本(可充用) l 快速实施的问题(易用&…...
宜选网的网站是什么做的/seo排名点击工具
Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等 社区版按照stable和edge两种方式发…...