iOS第八课——Navigation Controller和Tab bar Controller
今天我们要学习Navigation Controller和Tab bar Controller。
let myStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc2 = myStoryboard.instantiateViewController(withIdentifier: "Sec") as! SecViewController
self.navigationController?.pushViewController(vc2, animated: true) let vc3 = myStoryboard.instantiateViewController(withIdentifier: "Third") as! ThirdViewController
self.navigationController?.pushViewController(vc3, animated: true)
然后通过popViewController返回到指定的viewController(从右侧进入):
@IBAction func btn(_ sender: UIButton) {
//前提:由pushView方法跳转而来,三种方法同时只能用一种
//方式1:跳转到前一个页面
// _ = self.navigationController?.popViewController(animated: true)
//方式二:返回到第一个ViewContoller
// _ = self.navigationController?.popToRootViewController(animated: true)
//方式三:跳转到指定页面
for i in 0..<(self.navigationController?.viewControllers.count)! {
if self.navigationController?.viewControllers[i].isKind(of: SecViewController.self) == true {
_ = self.navigationController?.popToViewController(self.navigationController?.viewControllers[i] as! SecViewController, animated: true)
break
}
}
第二种——自下而上:向上弹出,向下返回(通过弹出模式框的方式自下而上的打出viewController):
@IBAction func btn(_ sender: UIButton) {
let myStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc2 = myStoryboard.instantiateViewController(withIdentifier: "Sec") as! SecViewController
self.present(vc2, animated: true, completion: nil)
}
这一个就是真的“返回”了:
@IBAction func backward(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
通过segue向下页跳转(iOS8之后):Action Segue:Show、Show Detail、Present Modally、Present As Popover、Custom。(具体含义,遇再论)。
在顶部Navigation Bar的Navigation Item(下级页面返回键)——是谁的返回键,就返回到谁:
修改其返回键的显示:
1、默认显示该Item的Title;2、也可以用Back Button更为灵活的显示(设置这个就显示这个,不再通过Title显示,就可以不与其冲突等等)
返回页的Navigation Item如果没有,就应该在该页的顶部Navigation Bar添加一个。
在底部Navigation toolbar的Bar Button Item:
在控件库中,将Bar Button Item拖到底部,可以自定义,也可以选择系统提供的图标库。
Navigation Controller的传值方式:
1、局部变量
2、全局变量
3、MVC模式(model以NSObject为父类)
然后通过segue进行ViewController之间的传值,所以一定要设置segue的Identifier:
前页向后页传值(在前页的prepare方法中进行传值):
局部变量方式:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "SecView" {
let SecView = segue.destination as! SecViewController
SecView.no = self.txt.text
}
}
在后页(接受页):可以在viewDidLoad方法中接受——>self.txt.text = no。
全局变量方式(在appDelgate中,设置全局变量var globle: String?):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "SecView" {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.globle = self.txt.text
}
}
MVC模式(前页后页都要声明model的变量,而且一定要在适当的时候实例化,所以model类一定要写init方法):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "SecView" {
stu = StuEnity(self.txt.text!)
let SecView = segue.destination as! SecViewController
SecView.stu = stu!
}
}
还有一种比较简单、也比较常用的方法——使用单例:
首先创建单例:
final class Single: NSObject {
//创建单例有两种方法
//使用全局变量创建单例
static let shared = Single()
public var name = ""
private override init() {
super.init()
} //类方法,使用结构体创建单例
class func shareInstance() -> Single {
struct single{
static var g_Instance = Single()
}
return single.g_Instance
}
}
然后前页可以向后页传值,后页也可以向前页传值:
//前页的代码:
class ViewController: UIViewController { let data = Single.shared @IBOutlet weak var nameLabel: UITextField! override func viewDidLoad() {
super.viewDidLoad()
self.nameLabel.text = data.name
} override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
data.name = self.nameLabel.text!
} }
//后页的代码:
class SecViewController: UIViewController { let data = Single.shared @IBOutlet weak var nameTextField: UITextField! override func viewDidLoad() {
super.viewDidLoad()
self.nameTextField.text = data.name
} @IBAction func back(_ sender: UIButton) {
data.name = self.nameTextField.text!
let stb = UIStoryboard(name: "Main", bundle: nil)
let back = stb.instantiateViewController(withIdentifier: "FirstView")
self.present(back, animated: true, completion: nil)
} }
先放一个简易版本:http://files.cnblogs.com/files/quanxi/test.zip。
然后还是将使用单例的简单例子放上来:http://download.csdn.net/download/leaf_and_wind/9726433
iOS第八课——Navigation Controller和Tab bar Controller的更多相关文章
- Tab Bar Controller和Navigation Controller混合使用详细教程
在IPHONE上,NAV和TAB混合使用的案例很多.但很多书籍都没详细介绍这个是怎么使用的.我也找了很久才弄清楚怎么做.现在分享给大家. 1.先建立一个Window-based Application ...
- iOS开发中的错误整理,Changing the delegate of a tab bar managed by a tab bar controller is not allowed
iOS [错误:'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.'] 错误:'Ch ...
- tab bar controller
下面记一下怎样通过代码的方式为选项卡添加视图. 1.创建一个基于Empty Application的项目 2.创建两个新类,基类选择UIViewController,勾选With XIB for us ...
- iOS开发:使用Tab Bar切换视图
iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Conten ...
- Iphone [Tab Bar实现多view切换,Picker,DataPicter实现
用Tab Bar Controller处理IPhone多个view切换, 而且还附有创建空项目,picker和DataPicker的实现! 具体步骤: 1.创建一个空项目,选择User Interfa ...
- Swift 4.0.2 按下tab bar item时, item会有内缩的animation效果(如同Twitter的tab bar 效果一样)
先上效果图: 假设 tab bar items 有5个.tag为0,1,2,3,4.storyboard中tab bar controller继承的class叫做xxxVC. class xxxVC: ...
- 学习笔记:Tab Bar 控件使用详解
注意这里是:Tab Bar 不是Tab Bar Controller. Tab bar是继承UIView,所以可以添加到ViewController里.是View就可以add到另一个View上去.Ta ...
- Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现
UI系列教程第八课:Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现 今天蓝老师要讲的是关于新浪新闻侧滑界面的实现.先看看原图: 如图所示,这种侧滑效果以另一种方式替 ...
- Python第八课学习
Python第八课学习 www.cnblogs.com/resn/p/5800922.html 1 Ubuntu学习 根 / /: 所有目录都在 /boot : boot配置文件,内核和其他 linu ...
随机推荐
- python 优矿自动化交易
一.进入官网,打开notebook 自己新建 notebook 二.在代码中编写自己的交易策略 https://uqer.io/help/faqApi/#account相关属性 在帮助文档中可以找到 ...
- win10下装Ubuntu双系统
本机状况: ssd在笔记本原来的硬盘位,已经安装win10 机械硬盘在光驱位 现在安装Ubuntukylin16到光驱位的机械硬盘建立双系统,并用Windows管理启动 1,将下载的Ubuntu镜像用 ...
- 数据见50条常用sql
问题及描述: --1.学生表 Student(Sid,Sname,Sage,Ssex) --Sid 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course ...
- Lind.DDD.Domain.ISortBehavor~上移与下移
在进行列表排序时,有个“上移”和“下移”操作,这个一般在内存里完成,然后统一提交到数据库中,对于上移与下移的设计,大叔在LIND.DDD.DOMAIN里有一个ISortBehavor接口,主要是说,如 ...
- 去 IOE,MySQL 完胜 PostgreSQL
本文转载自: http://www.innomysql.net/article/15612.html (只作转载, 不代表本站和博主同意文中观点或证实文中信息) 前言 上周参加了2015年的中国数据库 ...
- jQuery uploadify 文件上传
uploadify这个插件是基于js里面的jquery库写的.结合了ajax和flash,实现了这个多线程上传的功能.现在最新版为3.2.1. 在线实例 实例预览 Uploadify 在线实例Demo ...
- navigationController 返回前N个视图
前提是,由N个视图跳转过来的. //返回前n个 NSInteger index=[[self.navigationController viewControllers]indexOfObject:se ...
- PKCS#1规范阅读笔记2--------公私钥ASN.1结构
PKCS#1种介绍了哈希算法的OID等的ASN.1结构,因为使用ASN.1的解码工具(比如:ASN1View)时,会自动显示出各OID的含义,所以这里就不说明了.下面就只简单摘抄一下RSA公私钥的AS ...
- iOS多线程实现4-NSOperation
原文链接:http://www.cnblogs.com/mddblog/p/4816875.html 一.介绍 NSOperation是一个抽象类,我们可以使用系统提供的子类或者自己实现它的子类,具有 ...
- IOS开发之功能模块--输入框随着键盘的位置移动而移动
废话不多说,先直接上效果图: 先熟悉一下在Cocoa框架中会用到的key键: 然后直接上Demo的源码截图: 看代码之前,补充说一句,Demo中的文本框以及文本框的背后灰色的View是通过storyb ...