搭建一个QQ界面其实是一个很简单的实现,需要几种切换视图的控制器组合一起使用,即导航控制器、标签栏控制器、模态窗口。其中,将标签栏控制器设置为window的rootViewController,因为QQ主界面有4个控制器,分别为消息、联系人、动态、我,那么创建这4个控制器,然后再为它们分别创建一个导航控制器。此时,将之前创建的那4个控制器分别设置为对应的导航控制的rootViewcontroller。最后,将这4个导航控制器设置为标签栏控制器的子控制器即可。除此之外,我们仍然需要再创建一个登录的控制器,添加文本框输入账号和密码,如果用户输入正确,那么就以模态窗口的方式模态出主界面的窗口即可,如果输入不正确,就弹出一个提示框,给出提示信息。

具体的演示实例如下:

1.创建一个swift工程,截图为:

2.删除故事板中自带的控制器,然后创建需要的所有控制器并设置一下分组,截图为:

3.在AppDelegate.swift中设置偏好,将账号和密码归档

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        //设置偏好,将账号和密码存入沙盒
NSUserDefaults.standardUserDefaults().setValue("admin", forKey: "accountNum")
NSUserDefaults.standardUserDefaults().setValue("", forKey: "password") //对窗体初始化
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) //创建窗体的根控制器,将QQ的登录界面设置为根控制器
var rootViewController:LoginViewController? = LoginViewController()
self.window!.rootViewController = rootViewController! self.window!.makeKeyAndVisible()
return true
}

4.在LoginViewController.swift中操作代码如下:

//实现协议和声明属性

class LoginViewController: UIViewController,UIAlertViewDelegate {

    //声明属性(图像视图、标签、按钮、文本框)
var imageView:UIImageView?
var labelAccountNum:UILabel?
var labelPassWord:UILabel?
var loginButton:UIButton?
var textFiledAccountNum:UITextField?
var textFiledPassWord:UITextField?

//初始化控件

    override func viewDidLoad() {
super.viewDidLoad() //初始化图像视图
self.imageView = UIImageView(frame: CGRectMake(, , , ))
self.imageView!.image = UIImage(named: "QQ.png") //初始化账号标签
self.labelAccountNum = UILabel(frame: CGRectMake(, , , ))
self.labelAccountNum!.text = "账号:" //初始化密码标签
self.labelPassWord = UILabel(frame: CGRectMake(, , , ))
self.labelPassWord!.text = "密码:" //初始化账号文本框
self.textFiledAccountNum = UITextField(frame: CGRectMake(, , , ))
self.textFiledAccountNum!.layer.cornerRadius = 5.0
self.textFiledAccountNum!.backgroundColor = UIColor.grayColor()
self.textFiledAccountNum!.placeholder = "请输入账号"
self.textFiledAccountNum!.clearsOnBeginEditing = true
self.textFiledAccountNum!.becomeFirstResponder() //初始化密码文本框
self.textFiledPassWord = UITextField(frame: CGRectMake(, , , ))
self.textFiledPassWord!.layer.cornerRadius = 5.0
self.textFiledPassWord!.backgroundColor = UIColor.grayColor()
self.textFiledPassWord!.placeholder = "请输入密码"
self.textFiledPassWord!.clearsOnBeginEditing = true
self.textFiledPassWord!.secureTextEntry = true //初始化登陆按钮
self.loginButton = UIButton(frame: CGRectMake(, , , ))
self.loginButton!.layer.cornerRadius = 8.0
self.loginButton!.setTitle("登录", forState: .Normal)
self.loginButton!.backgroundColor = UIColor.purpleColor()
self.loginButton!.addTarget(self, action: "LoginButtonClicked:", forControlEvents: .TouchUpInside) //设置视图颜色
self.view.backgroundColor = UIColor.whiteColor() //将控件都添加到子视图
self.view.addSubview(self.imageView!)
self.view.addSubview(self.labelAccountNum!)
self.view.addSubview(self.labelPassWord!)
self.view.addSubview(self.textFiledAccountNum!)
self.view.addSubview(self.textFiledPassWord!)
self.view.addSubview(self.loginButton!)
}

//实现登陆事件(匹配账号和密码、实现界面的跳转)

    //实现登陆按钮事件
func LoginButtonClicked(sender:UIButton){ //取出偏好设置的账号和密码
let accountNum:String = NSUserDefaults.standardUserDefaults().valueForKey("accountNum")as String
let passWord:String = NSUserDefaults.standardUserDefaults().valueForKey("password") as String //进行账号和密码的匹配
if self.textFiledAccountNum!.text == accountNum && self.textFiledPassWord!.text == passWord{ //创建标签栏控制器
let TabViewController:UITabBarController? = UITabBarController()
TabViewController!.tabBar.backgroundColor = UIColor.darkGrayColor() //创建4个导航栏控制器
let NavgationVC1:UINavigationController? = UINavigationController()
let NavgationVC2:UINavigationController? = UINavigationController()
let NavgationVC3:UINavigationController? = UINavigationController()
let NavgationVC4:UINavigationController? = UINavigationController() //创建4个子控制器
let newsVC:NewsViewController? = NewsViewController()
let contactVC:ContactViewController? = ContactViewController()
let activeVC:ActiveViewController? = ActiveViewController()
let meVC:MeViewController? = MeViewController() //设置子控制器导航栏按钮标题
newsVC!.navigationItem.title = "消息"
contactVC!.navigationItem.title = "联系人"
activeVC!.navigationItem.title = "动态"
meVC!.navigationItem.title = "自己" //设置子控制器标签栏按钮标题
newsVC!.title = "消息"
contactVC!.title = "联系人"
activeVC!.title = "动态"
meVC!.title = "自己" //将4个子控制器分别推入对应的导航栏控制器
NavgationVC1!.pushViewController(newsVC!, animated: true)
NavgationVC2!.pushViewController(contactVC!, animated: true)
NavgationVC3!.pushViewController(activeVC!, animated: true)
NavgationVC4!.pushViewController(meVC!, animated: true) //设置标签栏按钮字体大小、选中和未选中时的颜色、偏移位置
UITabBarItem.appearance().setTitleTextAttributes(
[NSFontAttributeName:UIFont.systemFontOfSize(),NSForegroundColorAttributeName:UIColor.purpleColor()], forState: .Normal)
UITabBarItem.appearance().setTitleTextAttributes(
[NSForegroundColorAttributeName:UIColor.redColor()], forState: .Selected) UITabBarItem.appearance().setTitlePositionAdjustment(UIOffsetMake(, -)) //往标签栏控制器添加导航栏子控制器
TabViewController!.addChildViewController(NavgationVC1!)
TabViewController!.addChildViewController(NavgationVC2!)
TabViewController!.addChildViewController(NavgationVC3!)
TabViewController!.addChildViewController(NavgationVC4!) //模态出一个窗口
self.presentViewController(TabViewController!, animated: true, completion: nil)
}
//输入不正确,就弹出一个提示框
else{ var alertView:UIAlertView? = UIAlertView(title: "提示信息", message: "账号或密码输入有误", delegate: self, cancelButtonTitle: "确认") alertView!.show()
}
}
}

5.在NewsViewcontroller.swift中创建表格,实现协议,选中单元格跳转到聊天界面

import UIKit

class NewsViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    var tableView:UITableView?
var arrayM:NSMutableArray? override func viewDidLoad() {
super.viewDidLoad() //初始化
self.tableView = UITableView(frame: self.view.frame)
self.arrayM = NSMutableArray()
for i in ..<{
self.arrayM!.addObject("News--\(i)")
} //设置数据源和代理
self.tableView!.dataSource = self
self.tableView!.delegate = self //设置视图背景颜色
self.view.backgroundColor = UIColor.whiteColor() //添加到视图
self.view.addSubview(self.tableView!)
} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return
} func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //设置单元格重用标识符
let identifier = "Cell" //首先从队列中去取
var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? UITableViewCell //如果没有从队列中获取到,那么就重新创建一个
if cell == nil{ cell = UITableViewCell(style: .Subtitle, reuseIdentifier: identifier)
} //设置单元格内容
cell!.textLabel!.text = String(self.arrayM!.objectAtIndex(indexPath.row) as NSString)
cell!.backgroundColor = UIColor.grayColor() //返回重用单元格
return cell!
} //代理协议的方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //创建聊天控制器
let ChatVC:ChatViewController? = ChatViewController() //将聊天控制器压入栈中
self.navigationController!.pushViewController(ChatVC!, animated: true) //获取选中的单元
var cell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)
cell!.selected = false
} }

6.在ContactViewcontroller.swift中创建表格,实现协议,选中单元格跳转到聊天界面

import UIKit

class ContactViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    var tableView:UITableView?
var arrayM:NSMutableArray? override func viewDidLoad() {
super.viewDidLoad() //初始化
self.tableView = UITableView(frame: self.view.frame)
self.arrayM = NSMutableArray()
for i in ..<{
self.arrayM!.addObject("Contact--\(i)")
} //设置数据源和代理
self.tableView!.dataSource = self
self.tableView!.delegate = self //设置视图背景颜色
self.view.backgroundColor = UIColor.whiteColor() //添加到视图
self.view.addSubview(self.tableView!)
} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return
} func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //设置单元格重用标识符
let identifier = "Cell" //首先从队列中去取
var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? UITableViewCell //如果没有从队列中获取到,那么就重新创建一个
if cell == nil{ cell = UITableViewCell(style: .Subtitle, reuseIdentifier: identifier)
} //设置单元格内容
cell!.textLabel!.text = String(self.arrayM!.objectAtIndex(indexPath.row) as NSString)
cell!.backgroundColor = UIColor.greenColor() //返回重用单元格
return cell!
} //代理协议的方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //创建聊天控制器
let ChatVC:ChatViewController? = ChatViewController() //将聊天控制器压入栈中
self.navigationController!.pushViewController(ChatVC!, animated: true) //获取选中的单元
var cell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)
cell!.selected = false
}
}

7.在ActiveViewcontroller.swift中创建表格,实现协议,选中单元格跳转到聊天界面

import UIKit

class ActiveViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    var tableView:UITableView?
var arrayM:NSMutableArray? override func viewDidLoad() {
super.viewDidLoad() //初始化
self.tableView = UITableView(frame: self.view.frame)
self.arrayM = NSMutableArray()
for i in ..<{
self.arrayM!.addObject("Active--\(i)")
} //设置数据源和代理
self.tableView!.dataSource = self
self.tableView!.delegate = self //设置视图背景颜色
self.view.backgroundColor = UIColor.whiteColor() //添加到视图
self.view.addSubview(self.tableView!)
} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return
} func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //设置单元格重用标识符
let identifier = "Cell" //首先从队列中去取
var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? UITableViewCell //如果没有从队列中获取到,那么就重新创建一个
if cell == nil{ cell = UITableViewCell(style: .Subtitle, reuseIdentifier: identifier)
} //设置单元格内容
cell!.textLabel!.text = String(self.arrayM!.objectAtIndex(indexPath.row) as NSString)
cell!.backgroundColor = UIColor.cyanColor() //返回重用单元格
return cell!
} //代理协议的方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //创建聊天控制器
let ChatVC:ChatViewController? = ChatViewController() //将聊天控制器压入栈中
self.navigationController!.pushViewController(ChatVC!, animated: true) //获取选中的单元
var cell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)
cell!.selected = false
}
}

8.在MeViewcontroller.swift中创建表格,实现协议,选中单元格跳转到聊天界面

import UIKit

class MeViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    var tableView:UITableView?
var arrayM:NSMutableArray? override func viewDidLoad() {
super.viewDidLoad() //初始化
self.tableView = UITableView(frame: self.view.frame)
self.arrayM = NSMutableArray()
for i in ..<{
self.arrayM!.addObject("Me--\(i)")
} //设置数据源和代理
self.tableView!.dataSource = self
self.tableView!.delegate = self //设置视图背景颜色
self.view.backgroundColor = UIColor.whiteColor() //添加到视图
self.view.addSubview(self.tableView!)
} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return
} func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { //设置单元格重用标识符
let identifier = "Cell" //首先从队列中去取
var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? UITableViewCell //如果没有从队列中获取到,那么就重新创建一个
if cell == nil{ cell = UITableViewCell(style: .Subtitle, reuseIdentifier: identifier)
} //设置单元格内容
cell!.textLabel!.text = String(self.arrayM!.objectAtIndex(indexPath.row) as NSString)
cell!.backgroundColor = UIColor.orangeColor() //返回重用单元格
return cell!
} //代理协议的方法
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //创建聊天控制器
let ChatVC:ChatViewController? = ChatViewController() //将聊天控制器压入栈中
self.navigationController!.pushViewController(ChatVC!, animated: true) //获取选中的单元
var cell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)
cell!.selected = false
}
}

9.设置聊天界面ChatViewController.swift的背景颜色和标题

import UIKit

class ChatViewController: UIViewController {

    override func viewDidLoad() {
super.viewDidLoad() self.title = "聊天"
self.view.backgroundColor = UIColor.purpleColor()
}

演示结果截图:

开始时:                                 输入错误时:

  

输入正确后显示第一个界面:                                   选择第二个界面:

   

选择第三个界面:                                                       选择第四个界面:

    

随意在一个界面,点击一个单元格,进入聊天界面:   点击自己这个按钮,返回:

     

swift:用UITabBarController、UINavigationController、模态窗口简单的搭建一个QQ界面的更多相关文章

  1. nodejs 简单的搭建一个服务器

    前言: nodejs 主要是后台语言  node 是在终端运行的,所以他可以进行 dos 命令 模块 自定义 JavaScript 是前台语言 nodejs 是 也是使用我们的 JavaScript ...

  2. [转]Ionic最佳实践-使用模态窗口modal

    本文转自:http://m.blog.csdn.net/blog/betreex/45649689 原文地址:Ionic最佳实践-使用模态窗口modal 模态窗口的结构 在Ionic中,模态窗口通过$ ...

  3. 2019-6-23-WPF-解决弹出模态窗口关闭后,主窗口不在最前

    title author date CreateTime categories WPF 解决弹出模态窗口关闭后,主窗口不在最前 lindexi 2019-06-23 11:48:38 +0800 20 ...

  4. WPF 解决弹出模态窗口关闭后,主窗口不在最前

    本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口.使用另一个窗口在模态窗口前面.从任务栏打开模态窗口.关闭模态窗口.这时发现,主窗口会在刚才使用的另一个窗口下面 这是 Windows ...

  5. nodejs基础 用http模块 搭建一个简单的web服务器 响应纯文本

    首先说一下,我们平时在浏览器上访问网页,所看到的内容,其实是web服务器传过来的,比如我们访问www.baidu.com.当我们在浏览器地址栏输入之后,浏览器会发送请求到web服务器,然后web服务器 ...

  6. 用JqueryUI的Dialog+IFrame实现仿模态窗口效果

    大家有没有想过这样一个问题,当我点击某个图片的时候,我想弹出这个图片信息的详情并修改,于是你首先想到的是不是window.open?window.open方法确实可以,但是有它的局限性,比如,标题显示 ...

  7. Codrops 教程:基于 CSS3 的精美模态窗口效果

    Codrops 分享了漂亮的模态窗口效果实现方法,希望给前端开发人员提供一些创新显示对话框的启示.这个方案使用了触发按钮(或任何的 HTML 元素),在点击的时候出现一个模态窗口,带有简单的过渡(或动 ...

  8. 15款最好的 jQuery Modal(模态窗口)插件

    jQuery 模态窗口插件帮助网站开发人员显示网页中的特定内容,让用户聚焦到这个地方.模态窗口是嵌入到当前网页中,不用重定向到新网页的弹出窗口.这种技术可以用在图像画廊,电子商务网站,登陆框,电子邮件 ...

  9. 十、ios 模态窗口[实例]

    一.模态窗口概念 对话框一般分为两种类型:模态类型( modal )与非模态类型( modeless ).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话 ...

随机推荐

  1. 玩耍Hibernate系列(一)--基础知识

    Hibernate框架介绍: Hibernate  ORM  主要用于持久化对象(最常用的框架) Hibernate  Search 用于对对象进行搜索,底层基于Apache Lucene做的 Hib ...

  2. SQL SERVER中查询无主键的SQL

    --生成表 IF  EXISTS ( SELECT  name                FROM    sysobjects                WHERE   xtype = 'u' ...

  3. hibernate---ID生成策略

    5.1.4.1. Generator 可选的<generator>子元素是一个Java类的名字, 用来为该持久化类的实例生成唯一的标识.如果这个生成器实例需要某些配置值或者初始化参数, 用 ...

  4. jquery如何删除一个元素后面的所有元素

    $("div>span:first").nextAll().remove()

  5. HDAO one error

    对normal target设置的background clearcolor 导致 远处天空 通过了 normalRejectTest 所以要对normal target单独设置 不能通过test的 ...

  6. XSS的原理分析与解剖(二)

    0×01 前言:  上节(http://www.freebuf.com/articles/web/40520.html)已经说明了xss的原理及不同环境的构造方法.本期来说说XSS的分类及挖掘方法. ...

  7. mysql存储过程和函数使用实例

    1.需求:根据输入的年份,月份,和当前系统的年份比较,不满1年按1年计算,多出1年11个月也按1年计算. 2.计算得出来的使用年份,计算车辆残值. 3.存储过程 DELIMITER $$ USE `d ...

  8. 移动平台WEB前端开发技巧汇总

    原文 :http://uecss.com/mobile-platform-web-front-end-development-skills-summary.html 开发者们都知道在高端智能手机系统中 ...

  9. POJ 1006 Biorhythms (中国剩余定理)

    在POJ上有译文(原文右上角),选择语言:简体中文 求解同余方程组:x=ai(mod mi) i=1~r, m1,m2,...,mr互质利用中国剩余定理令M=m1*m2*...*mr,Mi=M/mi因 ...

  10. C++堆栈与函数调用

    一.C++程序内存分配 1)在栈上创建.在执行函数时,函数内局部变量的存储单元都在栈上创建,函数结束是,这些存储单元自动被释放.栈内存的分配运算内置于处理器的指令集中,一般采用寄存器来存取,效率很高但 ...