Swift学习(传值)

从前一页面向后一页面传值一般用到属性(比较简单的传值方式),当需要从后一页面向前传值时,我们一般想到的是代理和block,当然还有单例,今天我们就学习用Swift如何传值

我们从最简单的属性传值开始,使用了StoryBoard

第一个页面

class AddressBookViewController: UITableViewController<span style="color:#3333FF;">, InfoDelegate</span> {

    var array = [AddressInfo]() //给定初始数据数组

<span style="color:#FF0000;">   //func getData(ntf:NSNotification) {
        self.array.append(ntf.object as AddressInfo)
    }</span>

    override func viewDidLoad() {
        super.viewDidLoad()

       // <span style="color:#FF0000;">NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("getData:"), name:"aaaa", object:nil)</span>

        var model1 : AddressInfo = AddressInfo()//AddressInfo继承于NSObject,有三个属性

        var dic = Dictionary<String, String>()

        dic["name"] = "小明"
        dic["age"] = "40"
        dic["phoneNumber"] = "1200001125"
        model1.setValuesForKeysWithDictionary(dic)

        self.array.append(model1)
     }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return self.array.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
        var item = self.array[indexPath.row] as AddressInfo
        cell.textLabel.text = item.name
        return cell
    }
    // MARK: - Navigation

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
        if sender is UITableViewCell {
            var cell = sender as UITableViewCell
            var indexPath = tableView.indexPathForCell(cell)
            var model = self.array[indexPath!.row]
            var vc = segue.destinationViewController as InfoViewController
<span style="color:#3333FF;">//            vc.delegate = self</span>
            vc.info = model //在接受方定义属性接收需要传递的值
        } else {
            var vc = segue.destinationViewController as InfoViewController
<pre name="code" class="plain"><span style="color:#3333FF;">//            vc.delegate = self</span>

} }

func addInfo(info : AddressInfo) {

self.array.append(info)

//       self.tableView.reloadData

}

}


后一页面

import UIKit

<span style="color:#000099;">// protocol InfoDelegate {
//    func addInfo(info: AddressInfo)
// }</span>

class InfoViewController: UIViewController {

    var info : AddressInfo?
 <span style="color:#000099;">
//    var delegate : protocol<InfoDelegate>?</span>

    @IBOutlet weak var nameTF: UITextField!

    @IBOutlet weak var addButton: UIButton!

    @IBAction func add(sender: AnyObject) {

        var model = AddressInfo()
        var dic = Dictionary<String, String>()
        dic["name"] = nameTF.text
        dic["age"] = ageTF.text
        dic["phoneNumber"] = phoneNumberTF.text
        model.setValuesForKeysWithDictionary(dic);

<span style="color:#FF0000;">        //NSNotificationCenter.defaultCenter().postNotificationName("aaaa", object: model, userInfo:dic)</span>

<span style="color:#000099;">//        self.delegate!.addInfo(model)</span>

        var alt = UIAlertView(title:"已添加", message:"已经将name:\(nameTF.text)插入", delegate: self, cancelButtonTitle:"OK")
        alt.show()
    }
    @IBOutlet weak var updateButton: UIButton!
    @IBAction func update(sender: AnyObject) {
    }
    @IBOutlet weak var phoneNumberTF: UITextField!
    @IBOutlet weak var ageTF: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        if info == nil {
     updateButton.enabled = false
        } else {
            nameTF.text = info!.name
            ageTF.text = info!.age
            phoneNumberTF.text = info!.phoneNumber
        }

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

好的,我们再说说代理,其实Swit中的代理和OC中的代理相差不大,我们一样要在后一页面制定协议,写在import UIKit之后

protocol InfoDelegate {

func addInfo(info: AddressInfo)

}

在viewDidLoad之前定义属性代理

在add方法中使用代理传值,

在第一个页面遵守代理,设置代理,完成代理方法,这样就实现了代理传值(蓝色代码)

还有一种方法释永信更广,不单单用于后一页面向前一页面传值,还能用于,后面的页面,中间隔着几个页面进行传值,实现代码更为简单,上面红色代码块就是此方法

最后简单说一下单例

import UIKit

class SingleData: NSObject {
    var name : String?

    class func defaultSingleData() -> SingleData {
        var once : dispatch_once_t = 0
        var singleData : SingleData?
        dispatch_once(&once, {
            singleData = SingleData()
        })
        return singleData!
    }

    //升级版本
    class func defaultSingleData1() -> SingleData {
        struct SSSingleData {
            static var once : dispatch_once_t = 0
            static var singleData : SingleData?
        }
        dispatch_once(&SSSingleData.once, {
            SSSingleData.singleData = SingleData()
        })
        return SSSingleData.singleData!
    }

 }

有兴趣的同学可以使用单例做个小练习

时间: 02-06

Swift学习(传值)的相关文章

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&

Swift 学习-多线程

1:第一种多线程 func fun1(){ for i in 200...300{ NSLog("%d",i); } } func fun2(){ for i in 300...400{ NSLog("%d",i); } } var th1 = NSThread(target:self,selector:"fun1",object:nil); th1.start(); //开启线程 NSThread.detachNewThreadSelector

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten

Swift学习——使用if和switch来进行条件操作,使用for,while,和do-while来进行循环(三)

Swift学习--使用if和switch来进行条件操作,使用for,while,和do-while来进行循环 //switch支持随意类型的数据以及各种比較操作--不不过整数以及測试相等 //注意假设去掉default程序会报错 let strings = "hello3" switch strings{ case "hello1": let stringsComment = "say hello1" println("stringsC

汇集了很多swift 学习指南

https://github.com/ipader/SwiftGuide 1,059   Unstar7,294 Fork1,966 ipader/SwiftGuide CodeIssues 0Pull requests 0WikiPulseGraphs 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排.http://dev.swiftguide.cn 376 commits 3 branches 0 releases 12 contributors Swift 100.0%