开发者社区> cwift-tal> 正文

Swift语言IOS8开发战记9.transfer data without stroyboard

简介:        上一话我们实现了通过导航和控制器进行页面间的跳转,但是后一个页面是空的,本话来实现在跳转的同时,前一个页面向后一个页面传值,相信这也是大家什么关注的问题。
+关注继续查看
       上一话我们实现了通过导航和控制器进行页面间的跳转,但是后一个页面是空的,本话来实现在跳转的同时,前一个页面向后一个页面传值,相信这也是大家什么关注的问题。首先我们来试一下跳转后的页面显示一张固定的图片。在我们上一话写的跳转后的页面控制器中DetaiViewController中先设一个全局变量cgImageView来显示图片,实例化的过程写到viewDidLoad方法中,我们挑了一张图片来显示,代码如下:
    override func viewDidLoad() {
        super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
        cgImageView = UIImageView(frame: CGRectMake(0, 0, 320, 250))
        cgImageView?.image = UIImage(named: "128.png")
        self.view.addSubview(cgImageView!)
        // Do any additional setup after loading the view.
    }

运行一下,点击某一栏可以看到如下界面:


可以发现跳转后的页面,我们的图片最上端被导航栏遮挡了一部分,因为你把cgImageView放到了导航控制器中,坐标是从屏幕顶部开始的,所以会被位于最上端的导航控制器所遮挡,如何解决这个问题呢?我们把cgImageView区域的起点向下设置就好了。做如下修改,再次运行看看结果

cgImageView = UIImageView(frame: CGRectMake(0, 65, 320, 250))


怎么样,是不是看着舒服多了?虽然图片显示完整了,但是可以看出图片有被拉伸过的痕迹,那我们再在代码中设置一项:

 cgImageView?.contentMode = UIViewContentMode.ScaleAspectFit

设置成ScaleAspectFit是最舒服的,还有其他的选项,大家感兴趣的可以自己试试,现在的效果如下:


现在我们来试试传值,这需要使用set和get方法。在DetailViewController中写一个计算属性,如果不太懂的话,可以看我写的《Swift开发笔记3.Swift中setter和getter的基本用法》,计算属性如下,把对图片的操作语句从viewDidLoad中改写到set方法中,get暂时用不到,先返回一个空字符串

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

        }
        get {
        return ""
        }
    
    }

然后回到viewController中,在我们切换页面的时候获取当前行的图片,把图片名称赋值给imageName属性。代码如下:

let detail = DetailViewController()
            
            self.navigationController?.pushViewController(detail, animated: true)
            var image = restaurantImages[indexPath.row]
            detail.imageName = image

我们随便点两行看看效果:



现在在新页面的图片下面加一些信息,整个跳转页面控制器的完整代码如下:

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

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

        }
        get {
        return ""
        }
    
    }
    
    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 = UITableViewCell(style: .Default, reuseIdentifier: indentfier)
        cell.textLabel?.text = "hello" + String(indexPath.row)
        return cell
    }



}


我们加入了一个四行的tableView,参照之前的用法,注意datasource和delegate都是自身,这样控制器类本身还得继承UITableViewDataSourceUITableViewDelegate。

继承之后需要在类中实现父类的方法

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 = UITableViewCell(style: .Default, reuseIdentifier: indentfier)
        cell.textLabel?.text = "hello" + String(indexPath.row)
        return cell
    }

这些方法实现了对表格的设置。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
iOS开发 - 适合工程多环境切换(swift环境),适合经常打很多不同环境包的人
68 0
iOS开发 - swift通过Alamofire实现https通信
iOS开发 - swift通过Alamofire实现https通信
56 0
iOS 仿支付宝银行卡界面(支持Swift/OC)
在有支付相关的APP中,都有对应的钱包,虽然现在的支付宝,微信支付很流行,但是都是需要绑定自己的银行卡,那么这个银行卡的卡包页面该怎么实现呢?在网上找了许久也没有找到合适的,那就索性自己造轮子。
160 0
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
Swift:暗黑模式iOS 13以上支持是否跟随系统和iOS13以下的主题适配
601 0
iOS 应用之间的跳转(OC&Swift)
iOS 应用之间的跳转(OC&Swift)
366 0
iOS 问题 1: OC项目导入swift三方库不兼容问题
iOS 问题 1: OC项目导入swift三方库不兼容问题
445 0
iOS - Swift - NSAttributedString 显示Emoji乱码问题
iOS - Swift - NSAttributedString 显示Emoji乱码问题
412 0
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
iOS开发swift版异步加载网络图片(带缓存和缺省图片)
284 0
视频点播IOS播放器SDK Swift集成和实现
通过Swift 集成和实现阿里视频点播IOS播放器SDK的介绍
1505 0
[译] 在 iOS Swift 中的懒加载变量
这篇文章解释了在 Swift 中懒加载变量是如何工作的,你必须对闭包有一些了解。
583 0
+关注
cwift-tal
https://weibo.com/277195544?refer_flag=1005055013_
文章
问答
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
OpenStack Swift 海量小文件性能优化之路
立即下载
From Java_Android to Swift iOS
立即下载
Swift在Airbnb的应用实践
立即下载