这一节我们将创建一个用于实现XMPP framework的工程并实现应用程序的导航界面。
打开已经写好的模板工程
http://pan.baidu.com/s/1o6jyOsE
转载请注明出处:http://blog.csdn.net/yamingwu/article/details/43158027
模板工程的执行效果如下:
模板工程创建了一个滑动侧边栏菜单,我们来看看模板工程中的各个类已经实现了什么样的功能。
Helpers
YDHelper类实现了一个名为colorWithHexString的静态函数,用于为菜单项着色。
+ (UIColor *)colorWithHexString:(NSString *)stringToConvert
{
NSString *noHashString = [stringToConvert stringByReplacingOccurrencesOfString:@"#" withString:@""]; // remove the #
NSScanner *scanner = [NSScanner scannerWithString:noHashString];
[scanner setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]]; // remove + and $
unsigned hex;
if (![scanner scanHexInt:&hex]) return nil;
int r = (hex >> 16) & 0xFF;
int g = (hex >> 8) & 0xFF;
int b = (hex) & 0xFF;
return [UIColor colorWithRed:r / 255.0f green:g / 255.0f blue:b / 255.0f alpha:1.0f];
}
为了使这个函数成为全局函数,我们将YDHelper.h加入到预编译头文件YDChat-Prefix.pch中。
#import <Availability.h>
#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "YDDefinitions.h"
#import "YDHelper.h"
#endif
Definitions
YDDefinitions.h用于统一定义在应用程序中需要使用到的常量。这里定义了一些用于创建菜单的tag和服务器相关的一些域名。
#ifndef YDChat_YDDefinitions_h
#define YDChat_YDDefinitions_h
//Menu Items
static const NSString* YDSLideMenuStateNotificationEvent = @"YDSlideMenuStateNotificationEvent";
static const float tablewidth = 270.0f;
#define kMenuHomeTag @"kMenuHomeTag"
#define kMenuChatsTag @"kMenuChatsTag"
#define kMenuContactsTag @"kMenuContactsTag"
#define kMenuGroupChatTag @"kMenuGroupChatTag"
#define kMenuSettingsTag @"kMenuSettingsTag"
#define kXMPPServer @"openfire.yourdeveloper.net"
#define kxmppProxyServer @"openfire.yourdeveloper.net"
#define kxmppConferenceServer @"@conference.openfire.yourdeveloper.net"
#define kxmppSearchServer @"search.openfire.yourdeveloper.net"
#endif
创建菜单
侧边栏相关的代码存放在SlideMenu目录下,image中存放了侧边栏使用到的一些图标。
YDMenuItem类用于存放一个menu项对应的信息,比如:标题、颜色和图片名称等等。使用iniWithTitle方法对其进行初始化。
#import "YDMenuItem.h"
@interface YDMenuItem()
@property (nonatomic, strong) NSString *menuTitle;
@property (nonatomic, strong) NSString *backgroundColorHexString;
@property (nonatomic, strong) NSString *textColorHexString;
@property (nonatomic, strong) NSString* controllerTAG;
@property (nonatomic, strong) NSString* imageName;
@end
@implementation YDMenuItem
-(id)initWithTitle:(NSString *)title backgroundColorHexString:(NSString *)bgColorHexString textColorHexString:(NSString *)txtColorHexString viewControllerTAG:(NSString *)tag imageName:(NSString *)image
{self = [super init];
if ( self != nil)
{
self.menuTitle=title;
self.backgroundColorHexString=bgColorHexString;
self.textColorHexString=txtColorHexString;
self.controllerTAG=tag;
self.imageName=image;
}
return self;
}
@end
YDLeftMenuViewController是继承于ViewController用于绘制包含YDMenuItem的UITableView。didSelectRowAtIndexPath代理方法获取被选中的YDMenuItem,通知leftMenuSelectionItemClick的代理并将YDMenuItem传递给代理类。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
YDMenuItem* item = [self.menuItems objectAtIndex:indexPath.row];
[self.delegate leftMenuSelectionItemClick:item];
}
YDSlideMenuContainerViewController是侧边栏导航结构的核心,它负责绘制动画并对菜单进行监控。
YDBaseViewController类创建了一个UIBarButtonItem作为左侧的导航按钮,用于打开侧边栏:
- (void)viewDidLoad
{
[super viewDidLoad];
//if you dont want the menu buttons remove the following code
//Create left menu button
UIBarButtonItem *leftRevealButtonItem = [[UIBarButtonItem alloc] initWithImage:
[UIImage imageNamed:@"reveal-icon.png"]
style:UIBarButtonItemStyleBordered
target:self action:@selector(toggleLeftMenu:)];
self.navigationItem.leftBarButtonItem = leftRevealButtonItem;
}
YDHomeViewController作为应用程序的主界面继承于YDBaseViewController,暂时没有任何实际的功能,只是将背景设置为白色。
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor=[UIColor whiteColor];
}
实现菜单
YDAppDelegate类用于构建整个应用程序,包括主界面、navigation controller和侧边栏
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
application.statusBarHidden = YES;
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] ;
self.rootViewController = [[YDHomeViewController alloc] init];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.rootViewController];
//self.navigationController.navigationBarHidden = YES;
self.window.rootViewController = self.navigationController;
//Create left menu
YDMenuItem* homeItem = [[YDMenuItem alloc]initWithTitle:@"Home" backgroundColorHexString:@"0xcece10" textColorHexString:@"0xffffff" viewControllerTAG:kMenuHomeTag imageName:@""];
YDMenuItem* item1 = [[YDMenuItem alloc]initWithTitle:@"Chats" backgroundColorHexString:@"0xcece10" textColorHexString:@"0xffffff" viewControllerTAG:kMenuChatsTag imageName:@"chat"];
YDMenuItem* item2 = [[YDMenuItem alloc]initWithTitle:@"Contacts" backgroundColorHexString:@"0xbb11bb" textColorHexString:@"0xffffff" viewControllerTAG:kMenuContactsTag imageName:@"contacts"];
YDMenuItem* item3 = [[YDMenuItem alloc]initWithTitle:@"Group chat" backgroundColorHexString:@"0xaaaaaa" textColorHexString:@"0xffffff" viewControllerTAG:kMenuGroupChatTag imageName:@"groupicon"];
YDMenuItem* item4 = [[YDMenuItem alloc]initWithTitle:@"Settings" backgroundColorHexString:@"0xaaaaaa" textColorHexString:@"0xffffff" viewControllerTAG:kMenuSettingsTag imageName:@"settings"];
//create left menu Controller
self.leftMenuViewController = [[YDLeftMenuViewController alloc] init];
self.leftMenuViewController.delegate=self;
self.leftMenuViewController.menuItems = [NSArray arrayWithObjects:homeItem,item1,item2,item3,item4,nil];
//create and setup Container
self.container = [YDSlideMenuContainerViewController
containerWithCenterViewController:self.navigationController
leftMenuViewController:self.leftMenuViewController
rightMenuViewController:nil];
self.window.rootViewController = self.container;
self.container.delegate=self;
[self.window makeKeyAndVisible];
return YES;
}
并实现了侧边栏的两个代理方法leftMenuSelectionItemClick和toggleLeftMenu
#pragma mark SlideMenu Delegate
-(void)leftMenuSelectionItemClick:(YDMenuItem *)item
{
if ([item.controllerTAG length]>0)
{
[self.container setMenuState:YDSLideMenuStateClosed];
if ([item.controllerTAG isEqualToString:kMenuHomeTag])
{
//allocate the View Controller
//[self.navigationController PushViewController:vc animated:YES];
}
}
}
-(void)toggleLeftMenu
{
if (self.container.menuState == YDSLideMenuStateLeftMenuOpen)
{
[self.container setMenuState:YDSLideMenuStateClosed];
}
else
{
[self.container setMenuState:YDSLideMenuStateLeftMenuOpen];
}
}
至此,应用程序的基本骨架就建立好了,下一节我们会将XMPP Framework添加到工程中。