• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Swift iOS视图控制器和导航模式

武飞扬头像
编程工人
帮助1

本章学习到了:

1,代码弹出模态框,点击空白处收回键盘的事件

2,关闭模态窗口

3,pageControl scroll的使用

4,UIPageViewController翻页效果,本页事件翻页快有bug

5,三级表视图,加载数据,跳转,一级传值数据到二级的操作

以下为学习时的Demo代码

代码弹出模态框,点击空白处收回键盘的事件

  1.  
    import UIKit
  2.  
     
  3.  
    //代码弹出模态框,点击空白处收回键盘的事件
  4.  
    class ViewController: UIViewController {
  5.  
     
  6.  
    @IBOutlet weak var username: UITextField!
  7.  
    @IBOutlet weak var password: UITextField!
  8.  
     
  9.  
    //代码实现弹出模态框
  10.  
    @IBAction func onReg(_ sender: UIButton) {
  11.  
    //读取在故事板中定义 的 ID : NavViewController
  12.  
    let NavViewController = self.storyboard?.instantiateViewController(withIdentifier: "NavViewController") as! UINavigationController
  13.  
    //弹出模态框
  14.  
    self.present(NavViewController, animated: true, completion: {() -> Void in
  15.  
    print("弹出模态框")
  16.  
    })
  17.  
    }
  18.  
    //NavViewController
  19.  
     
  20.  
    override func viewDidLoad() {
  21.  
    super.viewDidLoad()
  22.  
    // Do any additional setup after loading the view, typically from a nib.
  23.  
     
  24.  
     
  25.  
    //注册点击事件
  26.  
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
  27.  
     
  28.  
    }
  29.  
     
  30.  
    //点击空白处关闭键盘方法
  31.  
    func handleTap(sender: UITapGestureRecognizer) {
  32.  
    if sender.state == .ended {
  33.  
    print("收回键盘")
  34.  
    self.username.resignFirstResponder()//username放弃第一响应者
  35.  
    self.password.resignFirstResponder()//password放弃第一响应者
  36.  
    }
  37.  
    sender.cancelsTouchesInView = false
  38.  
    }
  39.  
     
  40.  
    override func didReceiveMemoryWarning() {
  41.  
    super.didReceiveMemoryWarning()
  42.  
    // Dispose of any resources that can be recreated.
  43.  
    }
  44.  
     
  45.  
    }
学新通

关闭模态窗口

  1.  
    import UIKit
  2.  
     
  3.  
    //关闭模态窗口
  4.  
    class CreateViewController: UIViewController {
  5.  
     
  6.  
    @IBAction func onCancel(_ sender: UIBarButtonItem) {
  7.  
    //关闭模态
  8.  
    self.dismiss(animated: true, completion: {() -> Void in
  9.  
    print("关闭模态")
  10.  
    })
  11.  
    }
  12.  
     
  13.  
    @IBAction func onDone(_ sender: UIBarButtonItem) {
  14.  
    //关闭模态
  15.  
    self.dismiss(animated: true, completion: {() -> Void in
  16.  
    print("关闭模态")
  17.  
    })
  18.  
    }
  19.  
     
  20.  
    @IBAction func onSave(_ sender: UIBarButtonItem) {
  21.  
    //TODO 保存数据
  22.  
    //关闭模态
  23.  
    self.dismiss(animated: true, completion: {() -> Void in
  24.  
    print("关闭模态")
  25.  
    })
  26.  
    }
  27.  
     
  28.  
    override func viewDidLoad() {
  29.  
    super.viewDidLoad()
  30.  
     
  31.  
     
  32.  
    }
  33.  
     
  34.  
    override func didReceiveMemoryWarning() {
  35.  
    super.didReceiveMemoryWarning()
  36.  
    // Dispose of any resources that can be recreated.
  37.  
    }
  38.  
     
  39.  
     
  40.  
    /*
  41.  
    // MARK: - Navigation
  42.  
     
  43.  
    // In a storyboard-based application, you will often want to do a little preparation before navigation
  44.  
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  45.  
    // Get the new view controller using segue.destinationViewController.
  46.  
    // Pass the selected object to the new view controller.
  47.  
    }
  48.  
    */
  49.  
     
  50.  
    }
学新通

pageControl scroll的使用

  1.  
    import UIKit
  2.  
     
  3.  
    //ScrollView与PageControl实现平铺导航(图片切换)
  4.  
    //创建一个主View加入ScrollView(设置为可分页)与PageControl
  5.  
    //创建三个View放入3个imageView@图片放进去,每个需要定义storyboardID
  6.  
     
  7.  
    //pageControl scroll的使用
  8.  
    class PageViewController: UIViewController,UIScrollViewDelegate {
  9.  
     
  10.  
    @IBOutlet weak var scroll: UIScrollView! //ScrollView输出口
  11.  
    @IBOutlet weak var pageControl: UIPageControl! //PageControl输出口
  12.  
     
  13.  
    var page1: UIView! = nil
  14.  
    var page2: UIView! = nil
  15.  
    var page3: UIView! = nil
  16.  
     
  17.  
     
  18.  
    override func viewDidLoad() {
  19.  
    super.viewDidLoad()
  20.  
    //要实现UIScrollViewDelegate需要将当前scroll指向当前控制器
  21.  
    self.scroll.delegate = self
  22.  
     
  23.  
    //----------------初始化,将page1,2,3加为Scroll的子视图-----------------//
  24.  
    //self.scroll.frame.size.height|width //当前视图的宽或高
  25.  
    let scrollWidth = self.scroll.frame.size.width
  26.  
    let scrollHeight = self.scroll.frame.size.height
  27.  
     
  28.  
    //取得主storyboard
  29.  
    let mainStoryboard = self.storyboard
  30.  
    //设置scrollView实际内容的大小
  31.  
    self.scroll.contentSize = CGSize(width: scrollWidth * 3, height: scrollHeight)
  32.  
     
  33.  
    //获取3个pageViewcontroller视图,,赋值给page,然后设置page的坐标与大小
  34.  
    let page1Viewcontroller = mainStoryboard?.instantiateViewController(withIdentifier: "page1")
  35.  
    self.page1 = page1Viewcontroller?.view
  36.  
    self.page1.frame = CGRect(x: 0, y: 0, width: scrollWidth, height: scrollHeight)
  37.  
     
  38.  
    let page2Viewcontroller = mainStoryboard?.instantiateViewController(withIdentifier: "page2")
  39.  
    self.page2 = page2Viewcontroller?.view
  40.  
    self.page2.frame = CGRect(x: scrollWidth, y: 0, width: scrollWidth, height: scrollHeight)
  41.  
     
  42.  
    let page3Viewcontroller = mainStoryboard?.instantiateViewController(withIdentifier: "page3")
  43.  
    self.page3 = page3Viewcontroller?.view
  44.  
    self.page3.frame = CGRect(x: scrollWidth * 2, y: 0, width: scrollWidth, height: scrollHeight)
  45.  
     
  46.  
    //将page放到scrollView中
  47.  
    self.scroll.addSubview(page1)
  48.  
    self.scroll.addSubview(page2)
  49.  
    self.scroll.addSubview(page3)
  50.  
    }
  51.  
     
  52.  
    //------------实现UIScrollViewDelegate协议方法
  53.  
    //实现滚动视图的滚动事件,图标滚动时 page的小点也跟个翻页
  54.  
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
  55.  
    //获取scroll的偏移量对像
  56.  
    let offset = scrollView.contentOffset
  57.  
    //offset的x除以scrollWidth得到整数,赋值给pageControl的当前页
  58.  
    self.pageControl.currentPage = Int(offset.x) / Int(self.scroll.frame.size.width)
  59.  
    }
  60.  
     
  61.  
    //PageControl动作事件,page小点变换时,图片也跟着变化
  62.  
    @IBAction func changaPage(_ sender: UIPageControl) {
  63.  
    //得到pageControl的当前页数
  64.  
    let whicth = self.pageControl.currentPage
  65.  
    //设置scroll的偏移量,这种方法比较生硬,没有动画效果
  66.  
    //self.scroll.contentOffset = CGPoint(x: CGFloat(whicth) * self.scroll.frame.size.width, y: 0)
  67.  
    //使用setContentOffset可设置动画效果
  68.  
    self.scroll.setContentOffset(CGPoint(x: CGFloat(whicth) * self.scroll.frame.size.width, y: 0), animated: true)
  69.  
    }
  70.  
     
  71.  
    override func didReceiveMemoryWarning() {
  72.  
    super.didReceiveMemoryWarning()
  73.  
    // Dispose of any resources that can be recreated.
  74.  
    }
  75.  
     
  76.  
    }
学新通

UIPageViewController翻页效果

  1.  
    import UIKit
  2.  
     
  3.  
    //定义一个枚举
  4.  
    enum DirectionForward: Int{
  5.  
    case Before = 1 //向前翻页
  6.  
    case After = 2 //向后翻页
  7.  
    }
  8.  
     
  9.  
    //UIPageViewController翻页效果,问题:当效果为scroll的时候,第二张会重复,第一页翻,前一页后一页方法都会调用???
  10.  
    class FanyeViewController: UIViewController,UIPageViewControllerDelegate,UIPageViewControllerDataSource {
  11.  
     
  12.  
    //当前页的索引
  13.  
    var pageIndex = 0
  14.  
    //将枚举放到变量,翻页时随时更换
  15.  
    var directionForward = DirectionForward.Before //默认向后翻页
  16.  
    //定义当前视图控制器成员常量 pageViewController
  17.  
    var pageViewController: UIPageViewController!
  18.  
     
  19.  
    override func viewDidLoad() {
  20.  
    super.viewDidLoad()
  21.  
     
  22.  
    //实例化UIPageViewController
  23.  
    //UIPageViewControllerTransitionStyle为动画效果@翻书效果,枚举可以直接用点 .pageCurl
  24.  
    //UIPageViewControllerNavigationOrientation为设备朝向@水平的
  25.  
    self.pageViewController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.pageCurl, navigationOrientation: UIPageViewControllerNavigationOrientation.horizontal, options: nil)
  26.  
     
  27.  
     
  28.  
    //指定pageViewController的delegate与dataSource的实现者为当前视图
  29.  
    self.pageViewController.delegate = self
  30.  
    self.pageViewController.dataSource = self
  31.  
     
  32.  
    //取得主storyboard
  33.  
    let mainStoryboard = self.storyboard
  34.  
    //获取3个pageViewcontroller视图,,赋值给page,然后设置page的坐标与大小
  35.  
    let page1Viewcontroller = mainStoryboard?.instantiateViewController(withIdentifier: "page1")
  36.  
     
  37.  
    //设置首页显示的视图为page1ViewController @ 第一个视图
  38.  
    let viewControllers: NSArray = [page1Viewcontroller as Any]
  39.  
    self.pageViewController.setViewControllers((viewControllers as! [UIViewController]),direction: .forward,animated: true, completion: nil)
  40.  
    //将pageViewController加入到当前视图中
  41.  
    self.view.addSubview(self.pageViewController.view)
  42.  
     
  43.  
     
  44.  
    }
  45.  
     
  46.  
     
  47.  
    //-----------------实现数据源DataSource协议方法
  48.  
     
  49.  
     
  50.  
    //设置向前一页,必须实现的方法
  51.  
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  52.  
    //设置前当页索引
  53.  
    pageIndex = pageIndex - 1
  54.  
    if pageIndex < 0 {
  55.  
    pageIndex = 0
  56.  
    return nil
  57.  
    }
  58.  
     
  59.  
    //print("Before\(pageIndex)")
  60.  
     
  61.  
    self.directionForward = .Before
  62.  
     
  63.  
    //NSString将字符串和数字拼接为String
  64.  
    let pageId = NSString(format:"page%i",pageIndex 1)
  65.  
    //获取当前的page*并return 返回
  66.  
    let pvcontroller = self.storyboard?.instantiateViewController(withIdentifier: pageId as String)
  67.  
    return pvcontroller
  68.  
    }
  69.  
     
  70.  
    //设置向后一页,必须实现的方法
  71.  
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  72.  
    //设置前当页索引
  73.  
    pageIndex = pageIndex 1
  74.  
    if pageIndex > 2 {
  75.  
    pageIndex = 2
  76.  
    return nil
  77.  
    }
  78.  
     
  79.  
    //print("After\(pageIndex)")
  80.  
     
  81.  
    self.directionForward = .After
  82.  
     
  83.  
    //NSString将字符串和数字拼接为String
  84.  
    let pageId = NSString(format:"page%i",pageIndex 1)
  85.  
    //获取当前的page*并return 返回
  86.  
    let pvcontroller = self.storyboard?.instantiateViewController(withIdentifier: pageId as String)
  87.  
    return pvcontroller
  88.  
    }
  89.  
     
  90.  
     
  91.  
    //-----------------实现委托Delegate协议方法
  92.  
     
  93.  
    //设置书脊和是否双面显示
  94.  
    func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewControllerSpineLocation {
  95.  
    //true为双面显示,false为单面显示
  96.  
    self.pageViewController.isDoubleSided = false
  97.  
    //设置书脊为min最小,在左侧
  98.  
    return .min
  99.  
    }
  100.  
     
  101.  
    //该委托方法是在翻页动作完成后触发的方法
  102.  
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
  103.  
    //completed == true 说明翻页成功
  104.  
     
  105.  
    //没有翻页成功设置
  106.  
    if completed == false {
  107.  
    if self.directionForward == .Before {//如果向前翻页
  108.  
    pageIndex = 1 //还原翻页之前
  109.  
    //print("qian:\(pageIndex)")
  110.  
    }else if self.directionForward == .After {//如果向后翻页
  111.  
    pageIndex -= 1 //还原翻页之前
  112.  
    //print("hou:\(pageIndex)")
  113.  
    }
  114.  
    }
  115.  
    }
  116.  
     
  117.  
     
  118.  
     
  119.  
    override func didReceiveMemoryWarning() {
  120.  
    super.didReceiveMemoryWarning()
  121.  
    }
  122.  
     
  123.  
    }
学新通

三级表视图跳转传值:一级视图

  1.  
    import UIKit
  2.  
     
  3.  
    //三级表视图,第一级 @ 其中cell连线到二级表视图时,选择selectionSegue为点击整个cell时,accessory为点击扩展图标
  4.  
    class TreeTableViewController: UITableViewController {
  5.  
     
  6.  
    var allData: NSDictionary!
  7.  
    var provinces: NSArray!
  8.  
     
  9.  
    override func viewDidLoad() {
  10.  
    super.viewDidLoad()
  11.  
     
  12.  
    //获取plist文件路径
  13.  
    let plistPath = Bundle.main.path(forResource: "provinces_cities", ofType: "plist")
  14.  
    //获取属性列表文件中的全部数据保存到allData中
  15.  
    self.allData = NSDictionary(contentsOfFile: plistPath!)
  16.  
    //取allData字典所有key为数组放到provinces中
  17.  
    self.provinces = self.allData.allKeys as NSArray!
  18.  
    //设置当前Navigation下面表视图的标题
  19.  
    self.title = "省份信息"
  20.  
    }
  21.  
     
  22.  
    override func didReceiveMemoryWarning() {
  23.  
    super.didReceiveMemoryWarning()
  24.  
    // Dispose of any resources that can be recreated.
  25.  
    }
  26.  
     
  27.  
    //TableViewDataSource 协议方法实现
  28.  
    //返回表视图节的个数
  29.  
    override func numberOfSections(in tableView: UITableView) -> Int {
  30.  
    // #warning Incomplete implementation, return the number of sections
  31.  
    return 1
  32.  
    }
  33.  
     
  34.  
    //返回表视图每个节中的行数
  35.  
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  36.  
    // #warning Incomplete implementation, return the number of rows
  37.  
    return self.provinces.count
  38.  
    }
  39.  
     
  40.  
    //返回每一个 自定义cell 的内容
  41.  
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  42.  
    //请求可重用单元格,需要一个标识,CustomCellTableViewCell为自定义单元格类
  43.  
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as UITableViewCell
  44.  
    //设置扩展视图的类型,就是Cell右侧的小箭头
  45.  
    cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
  46.  
    //设置单元格中的主标题
  47.  
    cell.textLabel?.text = self.provinces[indexPath.row] as? String
  48.  
     
  49.  
    return cell
  50.  
    }
  51.  
     
  52.  
    //点击Cell会触发视图控制器的Segue方法
  53.  
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  54.  
    //判断是跳转的哪个segue,showtow为segue在故事板中定义的identifier
  55.  
    if segue.identifier == "showtwo" {
  56.  
    //得到二级(城市信息控制器)
  57.  
    let datailVC = segue.destination as! TreetwoTableViewController
  58.  
    //当前表视图被选择单元格
  59.  
    let indexPath = self.tableView.indexPathForSelectedRow
  60.  
    //以上得到的单元格的索引Row
  61.  
    let row = indexPath?.row
  62.  
    //当前单元格所对应的省份的名字
  63.  
    let selectname = self.provinces[row!]
  64.  
    //当前省份对应的城市信息的数组(将信息传给二级的listData)
  65.  
    datailVC.listData = self.allData[selectname] as! NSArray
  66.  
    //设置二级表视图名称
  67.  
    datailVC.title = selectname as? String
  68.  
    }
  69.  
    }
  70.  
     
  71.  
     
  72.  
    }
学新通

三级表视图跳转传值:二级视图

  1.  
    import UIKit
  2.  
    //三级表视图,第二级
  3.  
    class TreetwoTableViewController: UITableViewController {
  4.  
     
  5.  
    //在一级视图获取当前cell的省信息中的城市信息为数据传递过来
  6.  
    var listData: NSArray! = nil
  7.  
     
  8.  
    override func viewDidLoad() {
  9.  
    super.viewDidLoad()
  10.  
     
  11.  
     
  12.  
    }
  13.  
     
  14.  
    override func didReceiveMemoryWarning() {
  15.  
    super.didReceiveMemoryWarning()
  16.  
    // Dispose of any resources that can be recreated
  17.  
    }
  18.  
     
  19.  
    //TableViewDataSource 协议方法实现
  20.  
    //返回表视图节的个数
  21.  
    override func numberOfSections(in tableView: UITableView) -> Int {
  22.  
    // #warning Incomplete implementation, return the number of sections
  23.  
    return 1
  24.  
    }
  25.  
     
  26.  
    //返回表视图每个节中的行数
  27.  
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  28.  
    // #warning Incomplete implementation, return the number of rows
  29.  
    return self.listData.count
  30.  
    }
  31.  
     
  32.  
    //返回每一个 自定义cell 的内容
  33.  
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  34.  
    //请求可重用单元格,需要一个标识,CustomCellTableViewCell为自定义单元格类
  35.  
    let cell = tableView.dequeueReusableCell(withIdentifier: "towidentifier", for: indexPath) as UITableViewCell
  36.  
    //设置扩展视图的类型,就是Cell右侧的小箭头
  37.  
    cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
  38.  
    //某个省数据信息中的城市字典信息
  39.  
    let towDict = self.listData[indexPath.row] as! NSDictionary
  40.  
    //设置单元格中的主标题
  41.  
    cell.textLabel?.text = towDict["name"] as? String
  42.  
    return cell
  43.  
    }
  44.  
     
  45.  
    //点击Cell会触发视图控制器的Segue方法
  46.  
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  47.  
    //判断是跳转的哪个segue,showthree为segue在故事板中定义的identifier
  48.  
    if segue.identifier == "showthree" {
  49.  
    //得到三级(城市信息控制器)
  50.  
    let datailVC = segue.destination as! TreeThreeViewController
  51.  
    //当前表视图被选择单元格
  52.  
    let indexPath = self.tableView.indexPathForSelectedRow
  53.  
    //以上得到的单元格的索引Row
  54.  
    let row = indexPath?.row
  55.  
    //当前单元格所对应的城市信息字典
  56.  
    let twoDict = self.listData[row!] as! NSDictionary
  57.  
    //当前省份对应的城市信息的数组(将信息传给三级的twoUrl)
  58.  
    datailVC.twoUrl = twoDict["url"] as! String
  59.  
    //设置三级表视图名称
  60.  
    let threeTitle = NSString(format:"百科:%@",(twoDict["name"] as? String)!)
  61.  
    datailVC.title = threeTitle as String
  62.  
    }
  63.  
    }
学新通

三级表视图跳转传值:二级视图

  1.  
    import UIKit
  2.  
    //三级表视图,第三级
  3.  
    class TreeThreeViewController: UIViewController,UIWebViewDelegate {
  4.  
     
  5.  
    var twoUrl: String!
  6.  
     
  7.  
    @IBOutlet weak var threewebHF: UIWebView! //webview输出口
  8.  
    //如果上下有灰色或出现黑色,需要先加webview在连线
  9.  
     
  10.  
    override func viewDidLoad() {
  11.  
    super.viewDidLoad()
  12.  
     
  13.  
    //设置访问资源 - 百度搜索
  14.  
    let url = URL(string: self.twoUrl)//只能https,http当前版本做了限制
  15.  
    //建立网络请求
  16.  
    let request = URLRequest(url: url!)
  17.  
    //加载网络请求
  18.  
    self.threewebHF.loadRequest(request)
  19.  
     
  20.  
    //print(self.twoUrl)
  21.  
    self.threewebHF.delegate = self
  22.  
    }
  23.  
     
  24.  
    override func didReceiveMemoryWarning() {
  25.  
    super.didReceiveMemoryWarning()
  26.  
    // Dispose of any resources that can be recreated.
  27.  
    }
  28.  
     
  29.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibcgie
系列文章
更多 icon
同类精品
更多 icon
继续加载