搭建一个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. JavaScript 类型转换

    在 JavaScript 中有 5 中不同的数据类型: string number boolean object function 3 种对象类型: Object Date Array 2 个不包含任 ...

  2. Careercup - Microsoft面试题 - 5673934611546112

    2014-05-10 23:26 题目链接 原题: what is the best,worst and average case complexity for fibonacci no.s ..ex ...

  3. PyDev for Eclipse 简介

    PyDev 安装和配置 安装 PyDev 在安装 PyDev 之前,要保证您已经安装了 Java 1.4 或更高版本.Eclipse 以及 Python.接下来,开始安装 PyDev 插件. 启动 E ...

  4. Mysql的主从数据库没有同步的解决办法

    Mysql的主从数据库没有同步的解决办法 今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. ...

  5. SASS学习笔记_01

      scss两种格式 sass    大括号 scss   css写法   Arguments:  --no-cache –style compressed --update $FileName$:c ...

  6. HDU 5792 World is Exploding 树状数组+枚举

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ...

  7. sentinel.conf配置

    1.常用的配置 port 26379 # sentinel announce-ip <ip> # sentinel announce-port <port> dir /tmp ...

  8. JS 学习笔记--13---原型

    练习中使用的是IE11,如果有错误之处,还请各位朋友多多指教.本文关于原型难以描述,故多用代码展示 原型是JS中一个很重要的概念,也是JS中一个难点,语言上难以描述,原型对象的属性和方法叫做原型属性和 ...

  9. 疯狂java讲义——多态

    父类 f = new 子类(); 引用变量f,在编译时类型是父类,在运行时类型是子类类型.当这个引用变量调用子类重写父类的那个方法的时候,实际执行的是子类中重写后的那个方法.当运行的时候调用该变量的方 ...

  10. eclipse sdk 无法更新

    最近祖国越来越强了,强得android开发工具都没法更新了,但是祖国再怎么强也阻挡不了我开发的脚步.下面给大家分享个更新android sdk 的方法.方法原理就是利用国内镜像源. 工具/原料 电脑一 ...