swift语言IOS8开发战记11 Set NavigationController

简介:        上一话我们把ViewController类中的信息用Model来展示,那么新一话我们来尝试页面间传值。

       上一话我们把ViewController类中的信息用Model来展示,那么新一话我们来尝试页面间传值。首先来回顾一下我们现在工程里类的结构,如图:


之前的做法是主页面点击每一行在新打开的页面中显示一个小黄人的表情和一个自定义的tableView.现在我们修改一下跳转页面的控制器,也就是DetailViewController这个类,上一话中我们创建了一个名为RestModel,现在我们要在跳转的页面中使用这个Model中的信息,所以在DetailViewController这个类中新建一个Rest的实例,且是全局的

var rest = Rest?()

第一步是修改跳转后的页面的图片信息,在之前显示图片的地方进行修改,改成如下格式:

var restSingle :Rest {
        set(newRest){
            if cgImageView == nil {
            cgImageView = UIImageView(frame: CGRectMake(0, 65, 320, 250))
            }
            cgImageView?.image = UIImage(named: newRest.image)
            cgImageView?.contentMode = UIViewContentMode.ScaleAspectFit
            self.view.addSubview(cgImageView!)

        }
        get {
        return rest!
        }
    
    }

注意我们之前返回的是一个String类型的图片名称,现在我们要返回的是一个Data Model的实例,在ViewController中调用显示的时候也需要修改,在我们使用NavigationController进行push操作的地方,修改之前的代码如下:

var tempRest = restArray[indexPath.row]
            detail.restSingle = tempRest

在DetailViewController中如果要修改图片下方的tableView,方法跟之前的差不多,我们先定义一个新类用来显示,命名为DetailTableViewCell,代码如下

import UIKit

class DetailTableViewCell: UITableViewCell {
    
    var keyLabel: UILabel!
    var valueLabel: UILabel!
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        keyLabel = UILabel(frame: CGRectMake(14, 7, 100, 40))
        self.contentView.addSubview(keyLabel)
        valueLabel = UILabel(frame: CGRectMake(100, 4, 184, 40))
        self.contentView.addSubview(valueLabel)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

可以看到我们使用了更简便的写法,每一行显示的都是一个键值对,而具体显示什么与行数有关,DetailViewController的代码如下:

import UIKit
var cgImageView = UIImageView?()
var rest = Rest?()
class DetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    
    var restSingle :Rest {
        set(newRest){
            if cgImageView == nil {
            cgImageView = UIImageView(frame: CGRectMake(0, 65, 320, 250))
            }
            cgImageView?.image = UIImage(named: newRest.image)
            cgImageView?.contentMode = UIViewContentMode.ScaleAspectFit
            self.view.addSubview(cgImageView!)
            rest = newRest
        }
        get {
        return rest!
        }
    
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
        var tableY:CGFloat = 250
        var tableHeight:CGFloat = 233
        
        let tableView = UITableView(frame: CGRectMake(0, tableY, 320, tableHeight), style: .Plain)
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let indentfier = "detailCell"
        var cell = DetailTableViewCell (style: .Default, reuseIdentifier: indentfier)
        switch indexPath.row {
        case 0:
            cell.keyLabel.text = "Name"
            cell.valueLabel.text = rest?.name
        case 1:
            cell.keyLabel.text = "Type"
            cell.valueLabel.text = rest?.type
        case 2:
            cell.keyLabel.text = "Location"
            cell.valueLabel.text = rest?.location
        case 3:
            cell.keyLabel.text = "Be here"
            let here = (rest?.isVisit != nil) ? "Yes,I'm here" : "No"
            cell.valueLabel.text = here
        default:
            break
        }
        return cell
    }



}
Rest是Data Model,我们上一话介绍过了,在这再贴一下Rest的代码:

class Rest: NSObject {
    var name: String = ""
    var image: String = ""
    var location: String = ""
    var type: String = ""
    var isVisit: Bool = false
    init(name: String,image: String,location: String,type: String,isVisit: Bool){
    
    self.name = name
    self.image = image
    self.location = location
    self.type = type
    self.isVisit = isVisit
    }
}

可以看到我们得代码一一对应起来了,现在来展示一下效果图,这里不再展示主页面的代码,以一话主要是用来展示使用导航控制器来控制页面跳转,主页面效果如图:

当我们点击其中某一行的时候,比如点击第一行,跳转页面如下:


为了让我们的导航栏更加醒目,我们把它的颜色换成橘红色,这是全局的设置,所以要回到AppDelegate类中,在我们调用Navigation类的application方法中进行设置,代码如下:

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
       let  navController = UINavigationController(rootViewController: ViewController())
        self.window?.rootViewController = navController
        self.window?.makeKeyAndVisible() //设置可见
        UINavigationBar.appearance().tintColor = UIColor.whiteColor()
        UINavigationBar.appearance().barTintColor = UIColor(red: 231.0/255.0, green: 95.0/255.0, blue: 53.0/255.0, alpha: 0.3)
        let color: UIColor = UIColor.whiteColor()
        let font: UIFont = UIFont(name: "AvenirNextCondensed-DemiBold", size: 22.0)!
        UINavigationBar.appearance().titleTextAttributes = [
            NSForegroundColorAttributeName:color,
            NSFontAttributeName:font
        ]
        
        return true
    }
运行效果如下图:


如果我们觉得跳转后的界面的返回按钮不够简洁的话,可以在ViewController类中的viewDidLoad方法中设置清除字符串,代码如下:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

效果如图:



目录
相关文章
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
125 1
|
12月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
600 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
9月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
356 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
11月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
321 66
|
9月前
|
人工智能 程序员 API
iOS|记一名 iOS 开发新手的前两次 App 审核经历
啥,这玩意也有新手保护期?
231 0
|
11月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
1046 11
|
11月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
336 3
|
11月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
12月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。