Commit ed6ec6cd authored by Sandy's avatar Sandy

项目整体框架搭建 登录注册界面搭建 部分功能实现

parent ebe914ac
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:ALand.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:ALand.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
//
// AppDelegate.h
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
//
// AppDelegate.m
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "AppDelegate.h"
#import "BaseViewController.h"
#import "LoginViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
BaseViewController *baseVC = [[BaseViewController alloc] init];
self.window.rootViewController = baseVC;
// LoginViewController *baseVC = [[LoginViewController alloc] init];
// IBTUINavigationController *navc = [[IBTUINavigationController alloc] initWithRootViewController:baseVC];
// self.window.rootViewController = navc;
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "bac.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "home_tabbar.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "home_tabbar@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "mine_tabbar.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "mine_tabbar@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "shopping_tabbar.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "shopping_tabbar@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "store_tabbar.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "store_tabbar@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "login_top.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "login_top@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "Invisible_icon.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Invisible_icon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "Lock.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Lock@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "login_btn.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "login_btn@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "msg_icon.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "msg_icon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "phone_icon.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "phone_icon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "qq.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "qq@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "rigist_btn_bg.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "rigist_btn_bg@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "visible_icon.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "visible_icon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "weibo.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "weibo@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
{
"images" : [
{
"idiom" : "universal",
"filename" : "weichat.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "weichat@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
//
// BaseViewController.h
// CapitalChamberlain
//
// Created by 张杰 on 15/11/25.
// Copyright © 2015年 SunShine. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface BaseViewController : UITabBarController
@end
//
// BaseViewController.m
// CapitalChamberlain
//
// Created by 张杰 on 15/11/25.
// Copyright © 2015年 SunShine. All rights reserved.
//
#import "BaseViewController.h"
#import "HomeViewController.h"
#import "StoreViewController.h"
#import "MassageViewController.h"
#import "MineViewController.h"
@interface BaseViewController ()
@end
@implementation BaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentLoginView) name:@"presentLoginView" object:nil];
HomeViewController *homeVC = [[HomeViewController alloc] init];
StoreViewController *storeVC = [[StoreViewController alloc] init];
MassageViewController *masageVC = [[MassageViewController alloc] init];
MineViewController *mineVC = [[MineViewController alloc] init];
[self addChildVC:homeVC title:@"店铺" imageName:@"home_tabbar" selectImgName:@"shouye@2x"];
[self addChildVC:storeVC title:@"商城" imageName:@"store_tabbar" selectImgName:@"faxian@2x"];
[self addChildVC:masageVC title:@"消息" imageName:@"shopping_tabbar" selectImgName:@"dingdan@2x"];
[self addChildVC:mineVC title:@"我的" imageName:@"mine_tabbar" selectImgName:@"geren@2x"];
UIView *bgView = [[UIView alloc] initWithFrame:self.tabBar.bounds];
bgView.backgroundColor = [UIColor colorWithWhite:0.941 alpha:1.000];
[self.tabBar insertSubview:bgView atIndex:0];
self.tabBar.opaque = YES;
// Do any additional setup after loading the view.
}
- (void)addChildVC:(UIViewController *)childVC title:(NSString *)title imageName:(NSString *)imageName selectImgName:(NSString *)selectImgName {
//设置导航控制器
IBTUINavigationController *childNC = [[IBTUINavigationController alloc] initWithRootViewController:childVC];
//导航控制器标题
childVC.navigationItem.title = title;
childNC.navigationBar.translucent = NO;
//导航栏颜色
// childNC.navigationBar.barTintColor = kRed;
//tabBar字体颜色
self.tabBar.tintColor = kCustomGreenColor;
//tabBar上面的item的标题
childNC.tabBarItem.title = title;
//item图标
[childNC.tabBarItem setImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
[childNC.tabBarItem setSelectedImage:[[UIImage imageNamed:selectImgName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
//[[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Helvetica" size:17.0]} forState:UIControlStateNormal];
[self addChildViewController:childNC];
//设置导航栏字体颜色
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName, nil];
[childNC.navigationBar setTitleTextAttributes:attributes];
}
//- (void)presentLoginView
//{
// LoginViewController *loginVC = [[LoginViewController alloc] init];
// UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:loginVC];
// loginVC.loginBk = ^(){
//
// };
// loginVC.hidesBottomBarWhenPushed = YES;
// [self presentViewController:navc animated:YES completion:nil];
//}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// HomeViewController.h
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface HomeViewController : IBTUIViewController
@end
//
// HomeViewController.m
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "HomeViewController.h"
@interface HomeViewController ()
@end
@implementation HomeViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
This diff is collapsed.
//
// LoginViewController.h
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface LoginViewController : IBTUIViewController
@end
//
// LoginViewController.m
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "LoginViewController.h"
#import "ToLoginViewController.h"
#import "RigistViewController.h"
@interface LoginViewController ()
@end
@implementation LoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
- (IBAction)rigistAction:(UIButton *)sender {
RigistViewController *rigistVC = [[RigistViewController alloc] initWithNibName:@"RigistViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:rigistVC animated:YES];
}
- (IBAction)loginACtion:(UIButton *)sender {
ToLoginViewController *toLoginVC = [[ToLoginViewController alloc] initWithNibName:@"ToLoginViewController" bundle:[NSBundle mainBundle]];
//NSLog(@"123");
// ToLoginViewController *toLoginVC = [[ToLoginViewController alloc] init];
[self.navigationController pushViewController:toLoginVC animated:YES];
}
- (IBAction)toTencentLogin:(UIButton *)sender {
}
- (IBAction)toWeiChatLogin:(id)sender {
}
- (IBAction)toWeiboLogin:(id)sender {
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
This diff is collapsed.
//
// NextResetPasswordViewController.h
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface NextResetPasswordViewController : IBTUIViewController
@end
//
// NextResetPasswordViewController.m
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "NextResetPasswordViewController.h"
#import "UIButton+countDown.h"
@interface NextResetPasswordViewController ()
@property (weak, nonatomic) IBOutlet UIButton *sendCode;
@property (weak, nonatomic) IBOutlet UIButton *setPasswordVisible;
@property (weak, nonatomic) IBOutlet UITextField *phoneNumber;
@property (weak, nonatomic) IBOutlet UITextField *password;
@property (nonatomic) BOOL isPasswordVisible;
@end
@implementation NextResetPasswordViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.isPasswordVisible = NO;
self.navigationItem.title = @"重置密码";
// Do any additional setup after loading the view from its nib.
}
- (IBAction)sendCodeAction:(UIButton *)sender {
[self.sendCode startWithTime:60 title:@"重新发送" countDownTitle:@"s" mainColor:nil countColor:nil mainTitleColor:[UIColor colorWithHexString:@"51B2F6"] countTitleColor:[UIColor colorWithHexString:@"888888"]];
}
//确定
- (IBAction)confirmAction:(UIButton *)sender {
}
- (IBAction)setPasswordVisibleAction:(UIButton *)sender {
self.isPasswordVisible = !self.isPasswordVisible;
if (self.isPasswordVisible) {
[self.setPasswordVisible setImage:[UIImage imageNamed:@"visible_icon"] forState:UIControlStateNormal];
self.password.secureTextEntry = NO;
}else{
[self.setPasswordVisible setImage:[UIImage imageNamed:@"Invisible_icon"] forState:UIControlStateNormal];
self.password.secureTextEntry = YES;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
This diff is collapsed.
//
// ResetPasswordViewController.h
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface ResetPasswordViewController : IBTUIViewController
@end
//
// ResetPasswordViewController.m
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "ResetPasswordViewController.h"
#import "NextResetPasswordViewController.h"
@interface ResetPasswordViewController ()
@property (weak, nonatomic) IBOutlet UITextField *phoneNumber;
@end
@implementation ResetPasswordViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = @"重置密码";
// Do any additional setup after loading the view from its nib.
}
- (IBAction)nextAction:(UIButton *)sender {
#ifdef DEBUG
NextResetPasswordViewController *nextVC = [[NextResetPasswordViewController alloc] initWithNibName:@"NextResetPasswordViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:nextVC animated:YES];
#else
#endif
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//[self.navigationController setNavigationBarHidden:NO];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="ResetPasswordViewController">
<connections>
<outlet property="phoneNumber" destination="qH5-hL-hdE" id="jHC-Ar-JIA"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2UB-Ce-6Rq">
<rect key="frame" x="0.0" y="30" width="375" height="50"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="请输入绑定帐号的手机号码" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="qH5-hL-hdE">
<rect key="frame" x="32" y="14" width="311" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="xXX-ue-pI8"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="qH5-hL-hdE" firstAttribute="leading" secondItem="2UB-Ce-6Rq" secondAttribute="leading" constant="32" id="1N5-i1-ST4"/>
<constraint firstItem="qH5-hL-hdE" firstAttribute="centerY" secondItem="2UB-Ce-6Rq" secondAttribute="centerY" id="RTG-k0-OuI"/>
<constraint firstAttribute="height" constant="50" id="eVV-c6-nyc"/>
<constraint firstAttribute="trailing" secondItem="qH5-hL-hdE" secondAttribute="trailing" constant="32" id="tTc-fY-9MM"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="IuR-81-Oe4">
<rect key="frame" x="32" y="181" width="311" height="44"/>
<constraints>
<constraint firstAttribute="height" constant="44" id="aaT-L6-bmf"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="44" id="eyt-n4-KV9"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="22"/>
<state key="normal" title="下一步" backgroundImage="rigist_btn_bg">
<color key="titleColor" red="0.97254901959999995" green="0.97254901959999995" blue="0.97254901959999995" alpha="1" colorSpace="calibratedRGB"/>
</state>
<connections>
<action selector="nextAction:" destination="-1" eventType="touchUpInside" id="5lA-Tq-aCo"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="IuR-81-Oe4" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="32" id="IiV-jd-9u4"/>
<constraint firstItem="2UB-Ce-6Rq" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" constant="30" id="SER-RE-JD5"/>
<constraint firstAttribute="trailing" secondItem="2UB-Ce-6Rq" secondAttribute="trailing" id="dbL-2b-Oad"/>
<constraint firstItem="2UB-Ce-6Rq" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="e8y-oa-uSi"/>
<constraint firstItem="IuR-81-Oe4" firstAttribute="top" secondItem="2UB-Ce-6Rq" secondAttribute="bottom" constant="101" id="gN3-Ye-3mA"/>
<constraint firstAttribute="trailing" secondItem="IuR-81-Oe4" secondAttribute="trailing" constant="32" id="mnc-C3-Hgo"/>
</constraints>
<simulatedScreenMetrics key="simulatedDestinationMetrics" type="retina47"/>
</view>
</objects>
<resources>
<image name="rigist_btn_bg" width="490" height="65"/>
</resources>
</document>
//
// RigistViewController.h
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface RigistViewController : IBTUIViewController
@end
//
// RigistViewController.m
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "RigistViewController.h"
#import "UIButton+countDown.h"
@interface RigistViewController ()
@property (weak, nonatomic) IBOutlet UIButton *sendCodeBtn;
@property (weak, nonatomic) IBOutlet UIButton *setPasswordVisible;
@property (nonatomic) BOOL isPasswordVisible;
@property (weak, nonatomic) IBOutlet UITextField *phoneNumberTextFiled;
@property (weak, nonatomic) IBOutlet UITextField *codeTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextFiled;
@end
@implementation RigistViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.isPasswordVisible = NO;
self.navigationItem.title = @"注 册";
// Do any additional setup after loading the view from its nib.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO];
}
- (IBAction)sendCodeAction:(UIButton *)sender {
[self.sendCodeBtn startWithTime:60 title:@"发送验证码" countDownTitle:@"s" mainColor:nil countColor:nil mainTitleColor:[UIColor colorWithHexString:@"51B2F6"] countTitleColor:[UIColor colorWithHexString:@"888888"]];
}
- (IBAction)toAgreement:(UIButton *)sender {
}
- (IBAction)setPasswordVisible:(UIButton *)sender {
self.isPasswordVisible = !self.isPasswordVisible;
if (self.isPasswordVisible) {
[self.setPasswordVisible setImage:[UIImage imageNamed:@"visible_icon"] forState:UIControlStateNormal];
self.passwordTextFiled.secureTextEntry = NO;
}else{
[self.setPasswordVisible setImage:[UIImage imageNamed:@"Invisible_icon"] forState:UIControlStateNormal];
self.passwordTextFiled.secureTextEntry = YES;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
This diff is collapsed.
//
// ToLoginViewController.h
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
typedef void(^TheLoginBlock) (void);
@interface ToLoginViewController : IBTUIViewController
@property (nonatomic, weak) TheLoginBlock loginBlock;
@end
//
// ToLoginViewController.m
// ALand
//
// Created by Z on 16/3/17.
// Copyright © 2016年 Z. All rights reserved.
//
#import "ToLoginViewController.h"
#import "ResetPasswordViewController.h"
@interface ToLoginViewController ()
@property (weak, nonatomic) IBOutlet UITextField *phoneNumberTextFiled;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextFiled;
@end
@implementation ToLoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = @"登 录";
// Do any additional setup after loading the view from its nib.
}
- (IBAction)toLoginAction:(UIButton *)sender {
}
- (IBAction)forgetPasswordAction:(UIButton *)sender {
ResetPasswordViewController *resetVC = [[ResetPasswordViewController alloc] initWithNibName:@"ResetPasswordViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:resetVC animated:YES];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// MineViewController.h
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface MineViewController : IBTUIViewController
@end
//
// MineViewController.m
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "MineViewController.h"
@interface MineViewController ()
@end
@implementation MineViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// MassageViewController.h
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface MassageViewController : IBTUIViewController
@end
//
// MassageViewController.m
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "MassageViewController.h"
@interface MassageViewController ()
@end
@implementation MassageViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// StoreViewController.h
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "IBTUIViewController.h"
@interface StoreViewController : IBTUIViewController
@end
//
// StoreViewController.m
// ALand
//
// Created by Z on 16/3/18.
// Copyright © 2016年 Z. All rights reserved.
//
#import "StoreViewController.h"
@interface StoreViewController ()
@end
@implementation StoreViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// NSData+EncodeAdditions.h
// Cruiser
//
// Created by Xummer on 15/4/13.
// Copyright (c) 2015年 Xummer. All rights reserved.
//
#import <Foundation/Foundation.h>
void *NewBase64Decode(
const char *inputBuffer,
size_t length,
size_t *outputLength);
char *NewBase64Encode(
const void *inputBuffer,
size_t length,
bool separateLines,
size_t *outputLength);
@interface NSData (EncodeAdditions)
- (NSData *)md5Digest;
- (NSData *)sha1Digest;
- (NSString *)hexStringValue;
+ (NSData *)dataFromBase64String:(NSString *)aString;
- (NSString *)base64EncodedString;
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey:(NSString *)key;
@end
@interface NSData (FileExt)
- (BOOL)isImageType;
@end
This diff is collapsed.
//
// NSDate+FormatterAdditions.h
// JobTalk
//
// Created by Xummer on 14-5-16.
// Copyright (c) 2014年 BST. All rights reserved.
//
#import <Foundation/Foundation.h>
// https://github.com/samsoffes/sstoolkit/blob/master/SSToolkit/NSDate%2BSSToolkitAdditions.h
/**
Provides extensions to `NSDate` for various common tasks.
*/
@interface NSDate (FormatterAdditions)
///---------------
/// @name ISO 8601
///---------------
/**
Returns a new date represented by an ISO8601 string.
@param iso8601String An ISO8601 string
@return Date represented by the ISO8601 string
*/
+ (NSDate *)dateFromISO8601String:(NSString *)iso8601String;
/**
Returns a string representation of the receiver in ISO8601 format.
@return A string representation of the receiver in ISO8601 format.
*/
- (NSString *)ISO8601String;
/**
@param dateFormatter a date formatter, like @"%Y-%m-%dT%H:%M:%SZ".
@return A string representation of the receiver in dateFormatter.
*/
- (NSString *)stringWithFormatter:(NSString *)dateFormatter;
- (NSString *)chatAttachmentFormatterString;
- (NSString *)YMDHMSFormatterString;
- (NSString *)chatMsgFormatterString;
- (NSString *)localYMDString;
- (NSString *)briefTimeForTimeLine;
// yyyy-MM-dd HH:mm:ss
- (NSString *)httpParameterString;
// yyyy-MM-dd
- (NSString *)yearMonthDayString;
// yymmddhhmmssSSS
- (NSString *)mobileIDDateString;
- (NSDate *)endOfTheDay;
///--------------------
/// @name Time In Words
///--------------------
/**
Returns a string representing the time interval from now in words (including seconds).
The strings produced by this method will be similar to produced by Twitter for iPhone or Tweetbot in the top right of
the tweet cells.
Internally, this does not use `timeInWordsFromTimeInterval:includingSeconds:`.
@return A string representing the time interval from now in words
*/
- (NSString *)briefTimeInWords;
/**
Returns a string representing the time interval from now in words (including seconds).
The strings produced by this method will be similar to produced by ActiveSupport's `time_ago_in_words` helper method.
@return A string representing the time interval from now in words
@see timeInWordsIncludingSeconds:
@see timeInWordsFromTimeInterval:includingSeconds:
*/
- (NSString *)timeInWords;
/**
Returns a string representing the time interval from now in words.
The strings produced by this method will be similar to produced by ActiveSupport's `time_ago_in_words` helper method.
@param includeSeconds `YES` if seconds should be included. `NO` if they should not.
@return A string representing the time interval from now in words
@see timeInWordsIncludingSeconds:
@see timeInWordsFromTimeInterval:includingSeconds:
*/
- (NSString *)timeInWordsIncludingSeconds:(BOOL)includeSeconds;
/**
Returns a string representing a time interval in words.
The strings produced by this method will be similar to produced by ActiveSupport's `time_ago_in_words` helper method.
@param intervalInSeconds The time interval to convert to a string
@param includeSeconds `YES` if seconds should be included. `NO` if they should not.
@return A string representing the time interval in words
@see timeInWords
@see timeInWordsIncludingSeconds:
*/
+ (NSString *)timeInWordsFromTimeInterval:(NSTimeInterval)intervalInSeconds includingSeconds:(BOOL)includeSeconds;
@end
@interface NSDate (DateFormatterAdditions)
- (NSString *)timeStampStr;
+ (NSString *)curTimeStamp;
@end
@interface NSDate (DateCalculate)
- (NSDate *)dateAddHourse: (NSUInteger)hourse;
@end
@interface NSNumber (DateFormatterAdditions)
- (NSDate *)dateValue;
- (NSDate *)overZeroDateValue;
@end
@interface NSString (DateFormatterAdditions)
- (NSTimeInterval)timeStamp;
- (NSDate *)dateValue;
- (NSDate *)overZeroDateValue;
@end
This diff is collapsed.
//
// NSMutableArray+SafeInsert.h
// Cruiser
//
// Created by Xummer on 4/10/15.
// Copyright (c) 2015 Xummer. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSMutableArray (SafeInsert)
- (void)safeAddObject:(id)object;
- (void)safeInsertObject:(id)object atIndex:(NSUInteger)index;
- (void)safeRemoveObjectAtIndex:(NSUInteger)index;
- (void)safeReplaceObjectAtIndex:(NSUInteger)index withObject:(id)object;
- (void)removeFirstObject;
@end
@interface NSMutableDictionary (SafeInsert)
- (void)safeSetObject:(id)object forKey:(id<NSCopying>)key;
- (void)safeRemoveObjectForKey:(id)key;
@end
@interface NSMutableSet (SafeInsert)
- (void)safeAddObject:(id)object;
- (void)safeRemoveObject:(id)object;
@end
@interface NSMutableString (SafeInsert)
- (void)safeAppendString:(NSString *)string;
@end
@interface NSArray (SafeFetch)
- (id)safeObjectAtIndex:(NSUInteger)index;
@end
\ No newline at end of file
//
// NSMutableArray+SafeInsert.m
// Cruiser
//
// Created by Xummer on 4/10/15.
// Copyright (c) 2015 Xummer. All rights reserved.
//
#import "NSMutableArray+SafeInsert.h"
#pragma mark - NSMutableArray (SafeInsert)
@implementation NSMutableArray (SafeInsert)
- (void)safeAddObject:(id)object {
if (object) {
[self addObject:object];
}
}
- (void)safeInsertObject:(id)object atIndex:(NSUInteger)index {
if (index < self.count && object) {
[self insertObject:object atIndex:index];
}
}
- (void)safeRemoveObjectAtIndex:(NSUInteger)index {
if (index < self.count) {
[self removeObjectAtIndex:index];
}
}
- (void)safeReplaceObjectAtIndex:(NSUInteger)index withObject:(id)object {
if (index < self.count && object) {
[self replaceObjectAtIndex:index withObject:object];
}
}
- (void)removeFirstObject {
id firstObj = [self firstObject];
if (firstObj) {
[self removeObject:firstObj];
}
}
@end
#pragma mark - NSMutableDictionary (SafeInsert)
@implementation NSMutableDictionary (SafeInsert)
- (void)safeSetObject:(id)object forKey:(id <NSCopying>)key {
if (object) {
[self setObject:object forKey:key];
}
}
- (void)safeRemoveObjectForKey:(id)key {
[self removeObjectForKey:key];
}
@end
#pragma mark - NSMutableSet (SafeInsert)
@implementation NSMutableSet (SafeInsert)
- (void)safeAddObject:(id)object {
if (object) {
[self addObject:object];
}
}
- (void)safeRemoveObject:(id)object {
if (object) {
[self removeObject:object];
}
}
@end
#pragma mark - NSMutableString (SafeInsert)
@implementation NSMutableString (SafeInsert)
- (void)safeAppendString:(NSString *)string {
if ([string isKindOfClass:[NSString class]]) {
[self appendString:string];
}
}
@end
#pragma mark - NSArray (SafeFetch)
@implementation NSArray (SafeFetch)
- (id)safeObjectAtIndex:(NSUInteger)index {
@synchronized(self) {
if (index >= [self count]) return nil;
return [self objectAtIndex:index];
}
}
@end
//
// Created by kazuma.ukyo on 12/27/12.
//
// To change the template use AppCode | Preferences | File Templates.
//
#import <Foundation/Foundation.h>
// http://stackoverflow.com/questions/2060741/does-objective-c-use-short-circuit-evaluation
@interface NSNull (OVNatural)
- (void)forwardInvocation:(NSInvocation *)anInvocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
@end
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment