1. 程式人生 > >mac 純程式碼建立tableview

mac 純程式碼建立tableview

iOS和Mac OS的tableview使用略有不同

Mac OS的tableView需要一個Container來包裹它,才可以滑動,而iOS的不用
Mac OS的tableview裡面多了一個概念叫做column(列),而iOS中沒有這個概念
iOS中有section的概念,可是Mac OS中沒有(NSCollectionView中有)

註釋:如果Mac開發中需求必需使用section的話,可以去研究下NSCollectionView

Mac os的tableview在datasource做檢視的時候,有兩種情況:
1、View Based TableView
2、Cell Based TableView
這兩種情況可用的delegate方法不太相同,需要注意,否則可能出現delegate方法不被呼叫的問題

@interface AppDelegate ()<NSTableViewDataSource,NSTableViewDelegate>
{
    NSScrollView *_tableContainerView;
    NSMutableArray *_dataSourceArray;

    NSTextField *_scrollTF;
    NSButton *_deleteBtn;
    NSButton *_addBtn;

    NSInteger _selectedRowNum;
}
@property (weak) IBOutlet NSWindow *window;
@property
(nonatomic) NSTableView *tableView; @end @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { //虛擬的dataSource _dataSourceArray = [[NSMutableArray alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil]; _selectedRowNum = -1
; //刪除按鈕 _deleteBtn = [[NSButton alloc] initWithFrame:CGRectMake(415, 250, 70, 25)]; _deleteBtn.title = @"刪除選中行"; _deleteBtn.wantsLayer = YES; _deleteBtn.layer.cornerRadius = 3.0f; _deleteBtn.layer.borderColor = [NSColor lightGrayColor].CGColor; [_deleteBtn setTarget:self]; _deleteBtn.action = @selector(deleteTheSelectedRow); [self.window.contentView addSubview:_deleteBtn]; //新增按鈕 _addBtn = [[NSButton alloc] initWithFrame:CGRectMake(415, 170, 70, 25)]; _addBtn.title = @"上面添一行"; _addBtn.wantsLayer = YES; _addBtn.layer.cornerRadius = 3.0f; _addBtn.layer.borderColor = [NSColor lightGrayColor].CGColor; [_addBtn setTarget:self]; _addBtn.action = @selector(addRowUnderTheSelectedRow); [self.window.contentView addSubview:_addBtn]; //滾動顯示的TF _scrollTF = [[NSTextField alloc] initWithFrame:CGRectMake(415, 90, 80, 15)]; _scrollTF.stringValue = @"滾動 0.0"; _scrollTF.font = [NSFont systemFontOfSize:15.0f]; _scrollTF.textColor = [NSColor blackColor]; _scrollTF.drawsBackground = NO; _scrollTF.bordered = NO; _scrollTF.focusRingType = NSFocusRingTypeNone; _scrollTF.editable = NO; [self.window.contentView addSubview:_scrollTF]; //tableView _tableContainerView = [[NSScrollView alloc] initWithFrame:CGRectMake(0, 0, 400, 309)]; _tableView = [[NSTableView alloc] initWithFrame:CGRectMake(0, 20, _tableContainerView.frame.size.width-20, _tableContainerView.frame.size.height)]; [_tableView setBackgroundColor:[NSColor colorWithCalibratedRed:220.0/255 green:220.0/255 blue:220.0/255 alpha:1.0]]; _tableView.focusRingType = NSFocusRingTypeNone; //tableview獲得焦點時的風格 _tableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleRegular;//行高亮的風格 _tableView.headerView.frame = NSZeroRect; //表頭 _tableView.delegate = self; _tableView.dataSource = self; // 第一列 NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"firstColumn"]; [column1 setWidth:200]; [_tableView addTableColumn:column1];//第一列 // 第二列 NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"secondColumn"]; [column2 setWidth:200]; [_tableView addTableColumn:column2];//第二列 [_tableContainerView setDocumentView:_tableView]; [_tableContainerView setDrawsBackground:NO]; //不畫背景(背景預設畫成白色) [_tableContainerView setHasVerticalScroller:YES]; //有垂直滾動條 //[_tableContainer setHasHorizontalScroller:YES]; //有水平滾動條 _tableContainerView.autohidesScrollers = YES; //自動隱藏滾動條(滾動的時候出現) [self.window.contentView addSubview:_tableContainerView]; //監測tableview滾動 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(tableviewDidScroll:) name:NSViewBoundsDidChangeNotification object:[[_tableView enclosingScrollView] contentView]]; } #pragma mark - NSTableViewDataSource,NSTableViewDelegate #pragma mark -required methods - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { return _dataSourceArray.count; } //這個方法雖然不返回什麼東西,但是必須實現,不實現可能會出問題-比如行檢視顯示不出來等。(10.11貌似不實現也可以,可是10.10及以下還是不行的) - (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row { return nil; } #pragma mark -other methods - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { return 58; } - (nullable NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row { NSString *strIdt=[tableColumn identifier]; NSTableCellView *aView = [tableView makeViewWithIdentifier:strIdt owner:self]; if (!aView) aView = [[NSTableCellView alloc]initWithFrame:CGRectMake(0, 0, tableColumn.width, 58)]; else for (NSView *view in aView.subviews)[view removeFromSuperview]; NSTextField *textField = [[NSTextField alloc] initWithFrame:CGRectMake(15, 20, 156+50, 17)]; textField.stringValue = [NSString stringWithFormat:@"%@-ºµº-%@",tableColumn.identifier,[_dataSourceArray objectAtIndex:row]]; textField.font = [NSFont systemFontOfSize:15.0f]; textField.textColor = [NSColor blackColor]; textField.drawsBackground = NO; textField.bordered = NO; textField.focusRingType = NSFocusRingTypeNone; textField.editable = NO; [aView addSubview:textField]; return aView; } - (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row { // NSLog(@"====%ld", (long)row); _selectedRowNum = row; return YES; } - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn{ NSLog(@"%@", tableColumn.dataCell); } #pragma mark - tableview滾動處理 -(void)tableviewDidScroll:(NSNotification *)notification { NSClipView *contentView = [notification object]; CGFloat scrollY = contentView.visibleRect.origin.y-20;//這裡減去20是因為tableHeader的20高度 _scrollTF.stringValue = [NSString stringWithFormat:@"滾動 %.1f",scrollY]; } #pragma mark - 刪除&&新增某一行 -(void)deleteTheSelectedRow { if (_selectedRowNum == -1) {NSLog(@"請先選擇要刪除的行"); return;} [_tableView beginUpdates]; [_dataSourceArray removeObjectAtIndex:_selectedRowNum]; [_tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:_selectedRowNum] withAnimation:NSTableViewAnimationSlideUp]; [_tableView endUpdates]; _selectedRowNum = -1; } -(void)addRowUnderTheSelectedRow { if (_selectedRowNum == -1) {NSLog(@"請先選擇要哪行上面添一行"); return;} NSString *seletedDataObject = [_dataSourceArray objectAtIndex:_selectedRowNum]; NSString *addObject = [NSString stringWithFormat:@"%@+",seletedDataObject]; [_tableView beginUpdates]; [_dataSourceArray insertObject:addObject atIndex:_selectedRowNum]; [_tableView insertRowsAtIndexes:[NSIndexSet indexSetWithIndex:_selectedRowNum] withAnimation:NSTableViewAnimationSlideDown]; [_tableView endUpdates]; _selectedRowNum++; } #pragma mark - - (void)applicationWillTerminate:(NSNotification *)aNotification { // Insert code here to tear down your application } // 選中的響應 -(void)tableViewSelectionDidChange:(nonnull NSNotification* )notification{ self.tableView = notification.object; //do something NSLog(@"-----%ld", (long)self.tableView.selectedRow); }

相關推薦

mac 程式碼建立tableview

iOS和Mac OS的tableview使用略有不同 Mac OS的tableView需要一個Container來包裹它,才可以滑動,而iOS的不用 Mac OS的tableview裡面多了一個概念叫做column(列),而iOS中沒有這個概念

MFC動態建立dialog,程式碼建立dialog

參考:https://www.cnblogs.com/lidabo/p/3447007.html 大概思路:新增一個類,作為對話方塊模板 DlgTemplate.h #pragma once #include "afx.h" #define DLG_TEMPLATE_BUFFER_M

c 通過程式碼建立桌面快捷方式 建立程式選單項 將網頁新增到收藏夾

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

二、通過程式碼建立的UICollectionView的簡單使用

之前寫了一個Xib建立UiCollectionView的簡單使用的demo,現在寫個用純程式碼寫的,原理其實差不多,只是那個Cell之前是用XIb現在用一個繼承UiColelctionViewCell的類代替,如下所示: 1.首先建立一個CollectionCell的類繼

SparkSQL建立RDD:UDF(UserDataFrame)使用者建立自定義函式(包含動態建立schema,使用者自定義函式,查詢字元的個數)【Java版程式碼

Java版程式碼:  package com.bjsxt; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.spark.Spark

SparkSQL建立RDD:UDAF(UserDefinedAggregatedFunction)使用者自定義聚合函式【Java版程式碼

要實現8個方法,8個方法中,最為重要的有3個: initialize:初始化,在給,map端每一個分割槽的每一個key進行初始化,給0 update:在map端聚合 merge: 在reduce端聚合 Java版程式碼: package com.bjsxt; im

程式碼TableView例項

 UITableView是app開發中常用到的控制元件,功能很強大,多用於資料的顯示。下面以一個簡單的例項來介紹tableview的基本用法。(適合新手,高手飄過) @interface TableViewTestViewController : UIViewController<UITabl

swift 裡面tableview的cell程式碼建立方法

網上搜了好多,都是xib拖得,手寫的幾乎沒有,作為一個手寫黨,不能忍受啊!於是乎,寫了一個自認為可以的建立方法 。求各位swift大神指點 (Xcode版本6.4) 程式碼:在tableview裡面的使用 import UIKit class CustomCellTes

IOS刪除Storyboard程式碼工程的建立步驟

純程式碼Xcode工程的建立步驟 1建立一個新工程 2 刪除MainStoryBord ,LauchScreen.storyboard,ViewController.m,ViewController.h 備註:7.3版的LauchScreen.st

SparkStreaming部分:updateStateByKey運算元(包含從Linux端獲取資料,flatmap切分,maptopair分類,寫入到本地建立的資料夾中)【Java版程式碼

package com.bjsxt; import java.util.List; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.FlatMapFunction;

iOS 程式碼設定導航欄上建立左按鈕右按鈕

應該首先再appdelegate.m 裡面新增程式碼 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithO

OC 建立TableView基類並結合MJRefresh實現上拉重新整理,下拉載入

1.建立繼承自UITableView的基類BaseTableView: #import <UIKit/UIKit.h> @class BaseTableView; @protocol BaseTableViewDelegate <NSObject> @option

SQLserver程式碼建立約束

約束-保證資料完整性 資料庫約束是為了保證資料的完整性(正確性)而實現的一套機制。當建立了主外來鍵關係後,如果在外來鍵表中有任何記錄引用了主鍵表中的某條記錄,則在主鍵表中不能刪除該記錄。同時主鍵表也不能刪除。 注意:建立約束時,如果表中已經存在“非法資料”(與約束不一致的資料)

程式碼建立 WPF 旋轉動畫

原文: 程式碼建立 WPF 旋轉動畫 一、WPF窗體上有一個名為rectangle2的矩形 對應的XAML如下: <Window x:Class="WpfVideo.Window1"         xmln

使用ABAP程式碼建立S/4HANA裡的Sales Order

下圖是使用ABAP程式碼建立的S/4HANA的Sales Order的截圖: 其中紅色區域的值是我程式碼裡硬編碼的,而藍色是函式SD_SALESDOCUMENT_CREATE自己建立的。 來看下程式碼: DATA: ls_header TYPE bapisdhd1, ls_headerx

C# GDI繪製儀表盤(程式碼實現)

純程式碼實現GDI繪製儀表盤,效果在程式碼下面。public partial class HalfDashboardUc : UserControl { /// <summary> /// 儀表盤背景圖片 /// </summar

mac電腦bash_profile建立,開啟,編輯,儲存

.bash_profile就像Windows下面的環境變數視窗,只不過這裡是用編輯器來控制環境變數。   1、建立 .bash_profile   啟動終端, 進入當前使用者的home目錄(預設就是): cd ~     

java程式碼實現LogBack動態輸出日誌【無配置檔案程式碼

需求:       需要傳入某一個檔案或者類或者方法的名字,生成對應日誌檔案,且每一個傳入名字的檔案單獨有一個資料夾,子資料夾為日期,日期資料夾裡面包含warn.log,error.log,debug.log,info.log。通過過濾器實

非外掛程式碼實現WordPress增加瀏覽次數統計及顯示評論數

非外掛純程式碼實現WordPress增加瀏覽次數統計及顯示評論數 wp站點有一段時間了,之前優化了首頁載入速度,又感覺缺少瀏覽次數的統計很不方便,於是便折騰了一下,對瀏覽

二叉樹java程式碼建立

/** * * @ClassName: Tree * @Description: (二叉樹) * @author Administrator * @date 2018年5月31日 下午10:59:00 * */ public class Tree { private int []arr=