在 Swift 中使用来自单独函数的变量

Using a Variable from a Separate Function in Swift

我正在学习 Swift 并尝试使用 iOS8 Swift Dev's Cookbook 中的代码,但在使用 Swift 中的自定义函数生成的变量时遇到困难=13=] 函数将该产品放入 UILabel 对象中。

顶部的可选 phonephone 创建的 peoplePickerNavigationController 函数不对应。因此,labelPhone 对象不显示任何内容,而是显示从 peoplePickerNavigationController 函数中选择的 phone 号码。

如何从一个函数中获取一个 variable/constant 到 viewDidLoad 函数中的一个对象,以便它可以在 UI 中使用?

作为参考,我的 Storyboard 包含一个 UIButton "Contacts",可以点击它来执行 peoplePickerNavigationController 功能。

import UIKit
import AddressBookUI

class ViewController: UIViewController, ABPeoplePickerNavigationControllerDelegate {

    var phone : String?
    //I'm trying to pull up the phone variable down below, but the two are not corresponding. The optional above is what appears in the `labelPhone` object below rather than the contents of the phone way below.

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var labelPhone = UILabel(frame: CGRectMake(0, 0, 200, 21))
        labelPhone.center = CGPointMake(160, 284)
        labelPhone.textAlignment = NSTextAlignment.Center
        labelPhone.text = phone
        self.view.addSubview(labelPhone)

    }

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

    let personPicker: ABPeoplePickerNavigationController

    required init(coder aDecoder: NSCoder) {
        personPicker = ABPeoplePickerNavigationController()
        super.init(coder: aDecoder)
        personPicker.peoplePickerDelegate = self
    }

    func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController!) {
        /* Mandatory */
    }

    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
        /* A property in a person was picked */
    }

    @IBAction func performPickPerson(sender : AnyObject) {
        self.presentViewController(personPicker, animated: true, completion: nil)
    }

    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!) {
        /* Do we know which picker it is? */
        if peoplePicker != personPicker{
            return
        }

    /* Get all phone numbers this user has */
        let phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()

        let countOfPhones = ABMultiValueGetCount(phones)

        for index in 0..<countOfPhones{
            let phone = ABMultiValueCopyValueAtIndex(phones, index).takeRetainedValue() as String

            println(phone)


        }
    }

}

谢谢 <3

当前代码:

import UIKit
import AddressBookUI

class ViewController: UIViewController, ABPeoplePickerNavigationControllerDelegate {

var phone : String?
var labelPhone: UILabel?
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    labelPhone = UILabel(frame: CGRectMake(0, 0, 200, 21))
    labelPhone!.center = CGPointMake(160, 284)
    labelPhone!.textAlignment = NSTextAlignment.Center
    labelPhone!.text = phone
}



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

let personPicker: ABPeoplePickerNavigationController

required init(coder aDecoder: NSCoder) {
    personPicker = ABPeoplePickerNavigationController()
    super.init(coder: aDecoder)
    personPicker.peoplePickerDelegate = self
}

func peoplePickerNavigationControllerDidCancel(peoplePicker: ABPeoplePickerNavigationController!) {
    /* Mandatory */
}

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
    /* A property in a person was picked */
}

@IBAction func performPickPerson(sender : AnyObject) {
    self.presentViewController(personPicker, animated: true, completion: nil)
}

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!) {
    /* Do we know which picker it is? */
    if peoplePicker != personPicker{
        return

    }

/* Get all phone numbers this user has */
    let phones: ABMultiValueRef = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()

    let countOfPhones = ABMultiValueGetCount(phones)

    for index in 0..<countOfPhones{
        //let phone = ABMultiValueCopyValueAtIndex(phones, index).takeRetainedValue() as String

        phone = ABMultiValueCopyValueAtIndex(phones, index).takeRetainedValue() as? String
        labelPhone!.text = phone


        println(phone)



    }
}

}

首先,viewDidLoad只在视图加载时执行一次。要更改标签的文本,您需要执行以下操作:

var phone : String?
var labelPhone: UILabel?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    labelPhone = UILabel(frame: CGRectMake(0, 0, 200, 21))
    labelPhone.center = CGPointMake(160, 284)
    labelPhone.textAlignment = NSTextAlignment.Center
    self.view.addSubview(labelPhone)
}

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!) {
    // Got the phone 
    phone = ABMultiValueCopyValueAtIndex(phones, index).takeRetainedValue() as String
    labelPhone.text = phone
}