平时开发的时候,TableView用的最多了,而且也是很麻烦的,所以就先看看TableView在320里面应该怎么弄吧。然后其他的东西就可 以慢慢的理解了,所以说,代码就是最好的文档,虽然有时候会很愤怒的说,怎么这么magic,但是还是最好理解的一种方式,ok,咱们就慢慢的来。
先创建一个项目,如下,就创建一个最简单的项目(用320模板创建不知道为何不能编译通过,好吧,先不管)。
创建完成后,我们就把320加入到我们的项目中,可以看这里 。
注意,创建项目最好不要有下划线等奇怪的字符,否则那个脚本不能import 320,只能自己手动import了。今天我就弄了1个小时才明白这个问题。。
之前好久没有弄iPhone开发了,后来发现好像现在默认会有一个RootViewController,刚好是默认生成的MVC,嗯,这样默认情 况就比原来更好了,原来还要自己手动创建一个Controller,这样就更方便了。所以,既然如此,我们就搞搞RootViewController。
但是在写Controller之前,我们要改一下我们的AppDelegate。Delegate头文件可以不用改,不过建议去掉无用的 import,然后我们改代码文件,我们可以改成这样。当然,还要记得import <three20/Three20.h>。
#import " RootViewController.h "
@implementation _20tableviewAppDelegate
@synthesize window = _window;
@synthesize navigationController = _navigationController;
- ( void )applicationDidFinishLaunching:(UIApplication * )application {
// 定义url映射
TTNavigator * navigator = [TTNavigator navigator];
navigator.supportsShakeToReload = YES;
navigator.persistenceMode = TTNavigatorPersistenceModeAll;
navigator.window = self.window;
// [TTStyleSheet setGlobalStyleSheet:[[[StyleSheet alloc] init] autorelease]];
TTURLMap * map = navigator.URLMap;
[map from: @" * " toViewController:[TTWebController class ]];
[map from: @" tt://root " toViewController:NSClassFromString( @" RootViewController " )];
[map from: @" tt://nib/(loadFromNib:) " toSharedViewController:self];
[map from: @" tt://nib/(loadFromNib:)/(withClass:) " toSharedViewController:self];
[map from: @" tt://viewController/(loadFromVC:) " toSharedViewController:self];
[map from: @" tt://modal/(loadFromNib:) " toModalViewController:self];
if ( ! [navigator restoreViewControllers]) {
[navigator openURLAction:[TTURLAction actionWithURLPath: @" tt://root " ]];
}
}
- ( void )dealloc {
TT_RELEASE_SAFELY(_navigationController);
TT_RELEASE_SAFELY(_window);
[super dealloc];
}
- (UIViewController * )loadFromNib:(NSString * )nibName withClass:className {
UIViewController * newController = [[NSClassFromString(className) alloc]
initWithNibName:nibName bundle:nil];
[newController autorelease];
return newController;
}
- (UIViewController * )loadFromNib:(NSString * )className {
return [self loadFromNib:className withClass:className];
}
- (UIViewController * )loadFromVC:(NSString * )className {
UIViewController * newController = [[ NSClassFromString(className) alloc] init];
[newController autorelease];
return newController;
}
- (BOOL)application:(UIApplication * )application handleOpenURL:(NSURL * )URL {
[[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:URL.absoluteString]];
return YES;
}
@end
里面比较重要的是定义了URL映射,因为320是根据URL来进行转换的,开发模式和Web很像,以后我会具体说说URL映射这个东西在320里面的实现,现在先写上去就可以了。
里面还有很重要的是重写了loadFromNib之类的方法,以便在后面的代码中可以使用我们自己的方法。
然后,我们既然已经要用320了,所以就先把我们的默认TableView继承自320吧。打开RootViewController,先改头文件,代码如下。
@interface RootViewController : TTTableViewController {
}
然后再改代码文件。咱们把默认代码的都删掉。搞成这样。
@implementation RootViewController
- (id)initWithNibName:(NSString * )nibName bundle:(NSBundle * )bundle {
if (self = [super initWithNibName:nibName bundle:bundle]) {
self.title = @" 主菜单 " ;
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle: @" 主菜单 "
style: UIBarButtonItemStyleBordered
target: nil
action: nil] autorelease];
}
return self;
}
- ( void )createModel {
self.dataSource = [TTSectionedDataSource dataSourceWithObjects:
@" Google Reader " ,
[TTTableTextItem itemWithText: @" 订阅条目 " URL: @" tt://nib/DemoTableViewController " ],
[TTTableTextItem itemWithText: @" 我的信息 " URL: @" tt://nib/DemoTableViewController " ],
nil];
}
上面的代码很简单,主要是定义了一些基本信息,写完之后,我们就可以运行了,看看运行效果。
嗯,很容易,但是用默认的方法我们也可以做的,但是修改默认颜色就比较麻烦了,我们怎么使用320来修改颜色,调试样式呢?很简单,前面我说 了,320其实很像web开发,我们也可以创建类似CSS文件来定义样式。我们可以创建一个名叫StyleSheet的类。然后代码可以编写如下。
头文件,加一些引用。
#import < Three20Style / TTDefaultStyleSheet.h >
#import < Three20Style / TTDefaultStyleSheet + DragRefreshHeader.h >
@interface StyleSheet : TTDefaultStyleSheet {
}
@end
然后我们可以写一下样式文件。
@implementation StyleSheet
- (UIFont * )font {
return [UIFont fontWithName: @" Arial " size: 11 ];
}
- (UIFont * )tableFont {
return [UIFont fontWithName: @" Arial " size: 12 ];
}
- (UIFont * )tableHeaderPlainFont {
return [UIFont fontWithName: @" Arial " size: 14 ];
}
- (UIFont * )titleFont {
return [UIFont fontWithName: @" Arial " size: 18 ];
}
- (UIColor * )tableGroupedBackgroundColor {
return RGBCOLOR( 224 , 221 , 203 );
}
- (UIColor * )tableHeaderTextColor {
return [UIColor brownColor];
}
- (UIColor * )tableHeaderTintColor {
return RGBCOLOR( 224 , 221 , 203 );
}
- (UIColor * )navigationBarTintColor {
return RGBCOLOR( 100 , 128 , 108 );
}
然后,我们在AppDelegate里面添加引用即可,很简单。
> #import “StyleSheet.h”
> 在applicationDidFinishLaunching中加上[TTStyleSheet setGlobalStyleSheet:[[[StyleSheet alloc] init] autorelease]];即可。(如前面代码中的注释)
然后我们运行一下,看看是不是下面的效果。
是很简单吧。然后我们运行程序,嗯,点一下其中的“订阅条目”,嗯?怎么不能动。我们看看代码,代码里是这样写的。
> [TTTableTextItem itemWithText:@"订阅条目" URL:@"tt://nib/DemoTableViewController"]
Three20有一个很好的东西,就是基于URL进行Controller变换的,所以我们都不需要写如何变换View的方法,在这里,我们只要定 义了URL就行了,我们看上面的代码,URL是DemoTableViewController(前面的url规范可以自己规范,写在app delegate里,见上面的代码),但是我们的程序中没有DemoTableViewController,所以没有任何效果。
所以这里我们只要在程序里添加一个DemoTableViewController,然后把这个DemoTableViewController写完即可,然后再运行程序,是不是就可以很简单的跳转过去了?