快期末考了,写上了这学期的感受。
[window addSubview:rootViewController.view];
}
node023.data=RANK_REMARK_MONTHLY;
最后,把TreeViewController的loadView方法稍作修改,使根节点隐藏但同时展开:
node[i]=[[TreeNode alloc]init];
[super setSelected:selected animated:animated];
在TreeViewController的viewDidLoad方法中,增加一句: [TreeViewCell setIndent:45];
}
[TreeViewCell setIcoHeight:40];
id data;//节点可以包含任意数据
[node[6] addChild:node[7]];
-(void)addChild:(TreeNode*)child;
[cell setTreeNode:node];
UIImage* img=[UIImage imageNamed:filename];
}
node013.data=RANK_PLAY_MONTHLY;
if(treeNode.expanded){//若展开状态设置“+/-”号图标
CGRectMake(50+(15*node.deep), 0, 200,36)];
@property (assign) SEL onExpand;
if(self=[super init]) {
return self;
node[i].title=[NSString stringWithFormat:@"节点%d",i];
#import "TreeViewCell.h"
3、现在测试一下怎样通过继承来展现我们自己的树。新建TreeViewTestController类,继承TreeViewController。先不加入任何代码,运行效果如下:
好吧,直接如主题吧。
在TreeViewCell.h中,声明两个静态方法:
TreeNode* node022=[[TreeNode alloc]init];
+(TreeNode*)findNodeByKey:(NSString*)_key:(TreeNode*)node{
return a;
-(void)onExpand:(id)sender{
[selfconfigCell:cell :node];
[node02 addChild:node023];

-(void)onExpand:(TreeNode*)node{
#import "TreeNode.h"
[btnExpand setImage:img
三、实现树3
node011.data=RANK_PLAY_TODAY;
//NSLog(@"initTree===");
[imgIcon setFrame:CGRectMake(20+(15*node.deep), 6, 32, 32)];
p_node=nil;
return 1;
node023.title=@"本月破天一剑sf最多";
一、搭建基本框架
[btnExpand setFrame:CGRectMake(15*node.deep, 5, 32, 32)];
5、新建类TreeViewController,继承UIViewController.
if (cell==nil) {
===============.m文件==============
forState:UIControlStateNormal];
“叮..叮...”呦霍....上专业课了,带着自己的电脑,去上专业课了,在进教室的那刹那,我抢到了考前的座位,第一节课讲得就是输出语句,之类的还讲了环境变量,但是听输出语句还OK啦,但是看到了环境变量,我以为我们以后就是学这类的东西,我就想,完了,好难,以后怎么办啊。想着以前就好笑,呵呵...我们大一上学期学习的是《面向对象技术》在以后的每节课,感觉Java学习起来挺OK的,感觉越来越好。在一次晚自习,辅导员问我们谁的专业学习的比较好,我就说了一句:“有什么好处吗?”辅导员听到后把我喊出去了,我还以为辅导员是要教育我(确实要教育,不能插话的。)我出来辅导员就问我专业学习的怎么样,我说还行啊,老师讲的能听得懂,也能打得出。老师说:“我想在班里组建一个兴趣小组,专业兴趣小组,你就来当组长吧,是说这是不是好处呢?”但是我笑了,我当官了,我说:好啊,这是好处,我会当好兴趣小组组长的。兴趣小组的任务就是提高班里专业水平和解决上课的难问题每个星期都要讲课,也许是因为这份责任我学习专业的兴趣越来越大了,学习也挺用劲的。就这样我是班里专业牛B之一的“老师”了(因为我每周都要讲课,同学有的喊我老师,窃喜..窃喜)。在学习专业的同时,我也再为我的梦想奋斗,找好伙伴,组成一个团队(现在还在努力寻找中...)。
tree.deep=0;
// Configure the view forthe selected state
stringWithFormat:@"%d.png",[node.key intValue]+1];
[cell.imgIcon setImage:img];
1、节点其实就是一种树,有父节点、子节点。但树的最大用处在于遍历树、查找任意子节点。我们可以在TreeNode中增加遍历树的操作。
// Initialization code
现在的缩进显然大多了:
-(void)setTreeNode:(TreeNode *)node{
TreeNode* node023=[[TreeNode alloc]init];
}
3、TreeViewController.m文件:
[node[6] addChild:node[8]];
static NSString* cellid=@"cell";
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
-(void)initTree;
tree.hidden=YES;
return;
[tree addChild:node[0]];
-(int)childrenCount;
但记住这些操作必须在[cell setTreeNode:node];语句之后,因为setTreeNode方法会将节点的image属性设为默认的文件夹图片,在此之前修改显然是没有用的:
[super dealloc];
//节点:完美国际私服最多
在viewDidLoad方法中,我们使用TreeNode构建了一棵树,并把树的根节点和所有需要展开的节点放到nodes数组中(请看TreeNode的getNodes方法是怎么定义的)。注意,因为一开始所有节点的expanded总是false(不展开),所以node数组中除了根节点外,没有其他元素。
//子节点:今日魔兽世界私服最多
#import <Foundation/Foundation.h>
-(UITableViewCell*)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{
}
TreeNode* node=[nodes objectAtIndex:indexPath.row];
//子节点的添加方法
3.最后还有一个问题,上一级和下一级之间的缩进不是那么明显,我们可以调节缩进吗?
//子节点:本月传世sf最多
[node01 addChild:node012];
[self addSubview:label];
tree.deep=0;
}
[cell setOwner:self];
3、修改main.m: int retVal = UIApplicationMain(argc,argv, nil, @"TreeViewAppDelegate");
node[i].title=[NSString stringWithFormat:@"节点%d",i];
@end
node02.title=@"魔域sf最多";
nodes=[[NSMutableArray alloc]init];
TreeNode* node02=[[TreeNode alloc]init];
}
}
}
}
-(void)viewDidLoad{
}
}
然后修改getNodes方法,将 [array addObject:root];修改为:
node021.key=@"021";
(军训完了之后)....
[cell setOwner:self];
3、TreeViewCell.m文件:
===============.h文件==============
[children addObject:child];
node[i].key=[NSString stringWithFormat:@"%d",i];
[array addObject:root];
#import <Foundation/Foundation.h>
[node[3] addChild:node[9]];
node012.data=RANK_PLAY_WEEKLY;
TreeNode* node[10];
本文的目的,是研究有没有可能在一个TableView中呈现树形数据,尤其是树形菜单。众多的网络资料都强调,Cocoa框架不支持树形视图,苹果推荐程序员使用TableViewController+NavigationController的方式展现树形菜单。如果2-3层的树形数据还可以忍受,万一层次稍多一点,必须反复的用导航按钮在视图中转来转去,显然并不太方便。何况笔者认为2-3层的导航也要切换多次视图,也是一种浪费。
//子节点:本周征途sf最多
return children==nil?0:children.count;
{
if(children==nil children.count==0)
node[i].key=[NSString stringWithFormat:@"%d",i];
//如果你想定义自己的单元格视图(比如更换默认的文件夹图标),在子类中覆盖此方法
- (void)dealloc {
@interface TreeViewController : UITableViewController
二、实现树节点
我一直等待的专业课,终于等到星期二了,能上专业课了,我很高兴,很期待,
node[i]=[[TreeNode alloc]init];
@property (retain) id owner;
if ([predicate evaluateWithObject:node.key]) {
[cell setOnExpand:@selector(onExpand:)];
[TreeNode getNodes:tree :nodes];
node01.expanded=YES;
tree.title=@"根节点";
2、新建TreeNode类。
[cell.imgIcon setImage:nil];
node02.key=@"02";
SEL onExpand;//selector:点击“+”展开按钮时触发
我还荣幸能通过专业老师的推荐进了学校的虚拟公司,在这个环境里,看到专业很牛B的学长,学姐们,很Happy。
}
[imgIcon setImage:[UIImage imageNamed:@"folder_small.png"]];

cell=[[[TreeViewCell alloc]initWithStyle:UITableViewCellStyleDefault
[window makeKeyAndVisible];
2、TreeViewCell.h文件:
从高考完了的那一天就想着学什么专业呢,左思右想,没跟着老妈的想法去学习移动网维护之类的专业,选择了软件开发这门神圣的专业。
}
1、为了使我们的TreeView类更容易被程序员们使用,我们应当对其进行必要的封装。这样程序员们可以通过简单的继承或者实现某个我们定义的协议来使用它。这两种方式我们都可以采用,但我决定使用第一种,也就是把我们的实现封装成一个可以继承的超类,程序员要想使用它,必须继承并覆盖一系列的方法,这是似乎更容易使用些。
@property (retain) id data;
[owner performSelector:onExpand withObject:treeNode];
@end
#import "TreeNode.h"
}
@"minus.png"] forState:UIControlStateNormal];
@property (retain) TreeNode*p_node;
child.p_node=self;
也许是老天的戏弄,去学校的中巴车(学校两个校区,软件这个学区比较偏僻)到了校门口,下车了,看着校门口,笑了一笑,提着包走进了学校,一幕可怕的事情发生了,有一群人在跟学校的警卫大家,但是真的想死,后悔了,后悔了。后悔来到一个打架的学校,我是来学校学专业的,不是来学校看人们这么基情的活着的,这一幕以警卫失败而告终。之后去报名了,交了学费,领了军训的服装,去了寝室,之后几天就是军训的生活了,
TreeNode* a=[TreeNodefindNodeByKey:_key :each];
[self addSubview:imgIcon];
return cell;
1、新建类TreeViewCell.
@synthesize p_node,children,data,title,key,expanded;
}
@"SELFIN{'01','02'}"];
tree.title=@"根节点";
-(NSInteger)tableView:(UITableView *)tablenumberOfRowsInSection:(NSInteger)section{
tree.hidden=YES;
}
#import <UIKit/UIKit.h>
+(int) indent;
nodes=[[NSMutableArray alloc]init];
node022.title=@"本周蜀门sf最多";
如果我们可以控制节点是否需要显示就好了。要实现这一点,需要在TreeViewCell中增加一个新的变量:
首先,继承TableViewController并实现UITableViewDelegate和UITableViewDataSource协议。
children=[[NSMutableArray alloc]init];
[cell setTreeNode:node];
for (int i=0; i<10; i++) {
[tree addChild:node[0]];
[node[6] addChild:node[7]];
[self addSubview:btnExpand];
+(int)indent{
tree.expanded=YES;
//如果你想在选中某一个节点时,发生自定义行为,在子类中覆盖此方法
//节点:播放最多
NSString* title;//节点要显示的文字
//子节点:本周播放最多
[TreeViewCell setIcoWidth:40];
for(TreeNode* each in [node children]){
TreeNode* node012=[[TreeNode alloc]init];
[btnExpand setImage:nil forState:UIControlStateNormal];
@implementation TreeViewController
}
UILabel* label;//标签:显示节点title
@end
图片似乎了大一点,把它们从(40*40)调整为默认的32*32 就好。
五、 在TreeViewController中展现树视图6
tableView的数据源方法没有什么特别的。但对于TreeView,我们还需要实现一个方法(这里是onExpand方法,但其实叫什么名字无所谓),然后对所有cell使用setOnExpand把这个方法的selector传递给TreeViewCell,在TreeViewCell中,这个方法会在展开(+号)按钮点击时触发。
}
@"plus.png"] forState:UIControlStateNormal];
if([root hasChildren]) {
node022.data=RANK_REMARK_WEEKLY;
treeNode=node;
}
在TreeViewCell.m中(注意,是在implementation,而不是interface中),声明一个静态变量: static int indent=15;//默认缩进值15
}
tree=[[TreeNode alloc]init];
if([treeNode hasChildren]) {//如果有子节点
cellid];
[array addObject:root];
[node[2] addChild:node[4]];
-(void)initTree{
for(TreeNode* each in [root children]){
TreeNode* node=[nodes objectAtIndex:indexPath.row];
-(void)configCell:(TreeViewCell*)cell :(TreeNode*)node{
四、实现TreeViewCell4
//子节点:今日播放最多
一、搭建基本框架1
}
children=nil;
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
node022.key=@"022";
}
id owner;//表示 onExpand方法委托给哪个对象
@property (retain) NSString*title,*key;
九月一号,开学啦,老爸老妈那大包小包的东西提进了湖南一所专科学校,在去学校的一路上看着老爸,老妈不知道为什么有点心酸,在高中三年没好好读书,辜负了家里对我的期望,没上一所好的大学,呵呵...心中顿时伤感,在去学校的车上决定要在学校把自己的专业好好学好,这样才对得起自己,才对得起爸妈,在高中,我三年没有认真,在大学,我用我三年的时间补回高中三年的时间,用来提高自己的能力。
return self;
if([_key isEqualToString:[node key]]) {//如果node就匹配,返回node
[node[2] addChild:node[6]];
static NSString* cellid=@"cell";
+(void)getNodes:(TreeNode*)root:(NSMutableArray*) array;
window=[[UIWindow alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
@end
TreeNode* node021=[[TreeNode alloc]init];
}else {
同时,实现那两个静态访问方法:
TreeViewCell* cell=(TreeViewCell*)[tableView dequeueReusableCellWithIdentifier:
CGRectMake(20+(15*node.deep), 6, 32, 32)];
#pragmamark ===table view datasource methods====
}
node013.key=@"003";
[TreeNode getNodes:tree :nodes];
return cell;
}else {
//NSLog(@"%d",[treeNodehasChildren]);
[tree addChild:node02];
[node[2] addChild:node[4]];
BOOL hidden;//标志,节点是否隐藏
rootViewController=[[TreeViewController alloc]init];
二、实现树节点2
5、覆盖父类方法 configCell:
[cell setOnExpand:@selector(onExpand:)];
[node02 addChild:node021];
[node[0] addChild:node[3]];
if(owner!=nil && onExpand!=nil)//若用户设置了onExpand属性则调用
@property (retain)NSMutableArray* children;
修改(BOOL)application:didFinishLaunchingWithOptions方法 :
[self onSelectedRow:indexPath];
}
}
}
我写这个犹豫了很久,想想在CSDN都是在这条路上走了几年的,十几年的,我还只是走了半年的一个90后。 但是,在这半年里,我的感触颇深,所以就献丑了吧。
[node[0] addChild:node[2]];
<UITableViewDelegate,UITableViewDataSource>

nodes=[[NSMutableArray alloc]init];
[node[6] addChild:node[8]];
2、节点左边的文件夹图标真是另人讨厌,我们可以把它替换成自己的图片吗?只需要在tableView: cellForRowAtIndexPath:方法中修改TreeViewcell的image属性。
-(void)configCell:(TreeViewCell *)cell :(TreeNode *)node;
if(![roothidden])//只有节点被设置为“不隐藏”的时候才返回节点
//如果node没有子节点,则查找终止,返回nil
}
return p_node==nil?0:[p_node.deep]+1;
UIImage* img=[UIImage imageNamed:filename];
三、实现树
indent=value;
2、在TreeNode的头文件中增加方法声明:
//子节点:本月播放最多
}
TreeNode* treeNode;//每个单元格表示一个节点
在学习Java这条路上,我感受挺深的,学习的东西很多,要学好不能只跟着老师的脚步来走,自学现在也是我的另一门课程了。因为学习的东西太多了,想想还不认识Javad的时候我,把软件开发是想成比较那个一种固定的知识,其实不是比较难,是要走的路要走得很深,才能完全领悟。在大学这三年不能浪费时间,要好好把握,我知道创业不是那么容易的,不是同学说的仅仅靠一台电脑就能支撑起来的,我会努力的,为了梦想去奋斗,去拼搏。
TreeNode* tree;
[node01 addChild:node013];
[node[2] addChild:node[5]];
NSMutableArray* children;//子节点
[label setText:node.title];
四、实现TreeViewCell
+(void)setIndent:(int)value;
@interface TreeViewCell : UITableViewCell {
[btnExpand addTarget:self action:@selector(onExpand:)
}
returnnil;
加油!!
七、 进一步的封装10
[node[0] addChild:node[2]];
[node02 addChild:node022];
@property (assign) BOOL expanded;
}
label=[[UILabel alloc]initWithFrame:
运行效果如下:
两个方法都使用递归对树节点进行遍历,不同的是前者在查找到key相同的节点返回,而后者则直接把树的所有节点添加到数组中返回。
+(TreeNode*)findNodeByKey:(NSString*)_key:(TreeNode*)node;
node023.key=@"023";
七、 进一步的封装
@implementation TreeViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier {
4、修改TreeViewAppDelegate,删除属性window的声明,删除window的synthesize语句。增加变量声明:TreeViewController* rootViewController;
[tree addChild:node01];
[super viewDidLoad];
}
TreeViewCell* cell=(TreeViewCell*)[tableView dequeueReusableCellWithIdentifier:
//NSLog(@"labelis nil");
NSPredicate* predicate=[NSPredicate predicateWithFormat:
五、 在TreeViewController中展现树视图
forControlEvents:UIControlEventTouchUpInside];
treeNode.expanded=!treeNode.expanded;//切换“展开/收起”状态
[node[2] addChild:node[6]];
//NSLog(@"%d",img==nil);
[self.tableView reloadData];
UIButton* btnExpand;//按钮:用于展开子节点
2、TreeViewController.h文件:
-(void)initTree{
if(children==nil) {
-(void)addChild:(TreeNode*)child{
但是在initTree中必须放一些代码,这样当用户什么代码也没写的情况下,有一棵最基本的树显示在视图中:
+(void)getNodes:(TreeNode*)root:(NSMutableArray*) array{
node012.key=@"002";
}else {
forState:UIControlStateNormal];
[TreeNode getNodes:each :array];
2、我们在interface中声明了三个给使用者覆盖的方法:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
cell=[[[TreeViewCell alloc]initWithStyle:UITableViewCellStyleDefault
#import "TreeViewController.h"
-(void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath{
reuseIdentifier:cellid]autorelease];
}
}else {
-(BOOL)hasChildren{
}
[btnExpand setImage:[UIImage imageNamed:@"minus.png"]
TreeNode* node[10];
-(void)viewDidLoad{
4、覆盖父类方法initTree:
tree.expanded=YES;
return YES;
}
}
-(BOOL)hasChildren;
[node[0] addChild:node[1]];
}
if ([node hasChildren]) {
-(int) deep;//hasChildren的访问方法
军训完了之后,那天晚上就是团课了,说白了团课就是班会了,第一节班会主题是“我的梦想”。呵呵...我的梦想,我的梦想,不是希望能在大学找到一个女朋友,不是希望在自己能长命百岁,不是希望能当上学生会主席。我的梦想是学好专业,哥,要去创业,一毕业就去创业(不要笑,我还小)。这个梦想是我大学三年一直的目标,我要为这个目标而奋斗。这个班会,看出我们年轻人血气方刚,不知道有多少人能为自己的梦想而奋斗而坚持。
if (cell==nil) {
reuseIdentifier:cellid]autorelease];
tree.deep=0;
//如果你想呈现自己的树,在子类中覆盖此方法
#import "TreeNode.h"
node02.expanded=YES;
}else {
cellid];
六、 一些改进8
#import "TreeViewCell.h"
[TreeNode getNodes:tree :nodes];
node011.key=@"001";
NSLog(@"nodehas children");
node011.title=@"今日播放最多";
[self initTree];
if ([node expanded]) {
}
tree=[[TreeNode alloc]init];
for (int i=0; i<10; i++) {
TreeNode* node01=[[TreeNode alloc]init];

六、 一些改进>
}
return nodes.count;
[cell.imgIcon setImage:img];
//如果你想定义自己的单元格视图(比如更换默认的文件夹图标),在子类中覆盖此方法
if (a!=nil) {
-(void)onExpand:(TreeNode*)node方法有一点特殊,它带了一个参数。由于在TreeViewCell中,触发该方法时用到了 performSelector:withObject:方式而不是普通的performSelect:发送,所以TreeViewCell有可能把这个单元格所包含的TreeNode对象传递到TreeViewController的onExpand:来。从而可以通过这个参数读到各个单元格的modal数据。
return NO;
@implementation TreeNode
}
NSLog(@"retrievenode:%@ %@",each.title,each.key);
@end
-(void)onSelectedRow:(NSIndexPath *)indexPath;
[node[0] addChild:node[1]];
[super viewDidLoad];
[label setFrame:CGRectMake(50+(15*node.deep), 0, 200, 36)];
-(void)setTreeNode:(TreeNode *)node;
nodes=[[NSMutableArray alloc]init];
return indent;
node021.title=@"今日传世sf最多";
@end
TreeNode* p_node;//父节点
tree.title=@"根节点";
}
-(int)deep{
[node[3] addChild:node[9]];
}else if([node hasChildren]){//如果node有子节点,查找node 的子节点

}
UIImageView* imgIcon;//图标
[TreeViewCell setLabelMarginLeft:10];
4、 findNodeByKey 和getNodes 方法:
在setTreeNode方法中,替换所有的 15*node.deep 为 indent*node.deep
@synthesize onExpand,imgIcon,owner;
1.无论我们需不需要,TreeView上总是会显示一个“根节点”,哪怕这个根节点并没有什么实际的用途。
+(void)setIndent:(int)value{
btnExpand=[[UIButton alloc]initWithFrame:CGRectMake((15*node.deep), 5, 32, 32)];
[TreeViewCell setIndent:25];
NSString* key;//主键,在树中唯一
@property (retain)UIImageView* imgIcon;
node013.title=@"本月播放最多";
TreeNode* node011=[[TreeNode alloc]init];
node01.key=@"01";
key=nil;
return node;
1、接下来应该建立一个TableViewController,使用我们的TreeViewCell。新建类TreeViewController。
NSString* filename=[NSString stringWithFormat:@"%@.png",node.key];
}
UIImage *img=[UIImage imageNamed:@"plus.png"];
tree=[[TreeNode alloc]init];
[node01 addChild:node011];
}
-(id)init{
谢谢各位。祝大家元旦快乐。
这样,根节点不显示了,显示的是它已被展开的子节点“节点0” 。
1、树由节点构成。树节点是一种链表结构。它包含有父节点、子节点等内容,同时应实现节点添加等操作。
node021.data=RANK_REMARK_TODAY;
}
2、删除MainWindow.xib,删除plist中Main nib file basename;
node01.title=@"播放最多";
else return YES;
-(UITableViewCell*)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath{
BOOL expanded;//标志:节点是否已展开,保留给TreeViewCell使用的
@interface TreeNode : NSObject {
然后修改implementation中的几个地方,调用这三个方法:
NSString* filename=[NSString
}
if (label==nil) {
[TreeNode getNodes:tree :nodes];
[btnExpand setImage:[UIImage imageNamed:
[node[0] addChild:node[3]];
[node[2] addChild:node[5]];
imgIcon=[[UIImageView alloc]initWithFrame:
1、新建Winddow-Based-Application项目TreeView;
NSMutableArray* nodes;
TreeNode* node013=[[TreeNode alloc]init];
[btnExpand setImage:[UIImage imageNamed:
node012.title=@"本周播放最多";
-(int)childrenCount{