[英]cannot pass a variable from a function in a class to another function in Swift
大约一周前,我问了部分问题,但被否决了,所以我花了一些时间解决它。 我已经解决了如何在UIPicker和函数之间传递的第一部分。 我创建了一个类calculateTime(),并且内部是我的函数,该函数接受数组作为参数。 然后,计算出一个我标记为数字的数字。 接下来,我需要将传递计数传递给update()函数,以便可以使用倒数计时器更新文本标签。 无论我将该功能放在何处,都无法正常使用。 如果在类中,则会出现选择器错误。 如果它不在类中,我将无法获得count的价值。 它被我在代码顶部设置的值覆盖。 我在这里粘贴所有代码。 我希望有人可以在这里为我提供帮助,我对自己无法解决这个问题感到非常沮丧。
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
@IBOutlet weak var dep: UITextField!
@IBOutlet weak var picker: UIPickerView!
@IBOutlet weak var arrivesAt: UIButton!
@IBOutlet weak var departsFrom: UIButton!
@IBOutlet weak var arr: UITextField!
@IBOutlet weak var countDownLabel: UILabel!
var pickerData: [[String]] = [[String]]()
var timer: NSTimer!
var count = 2
var arrayTimes = [""]
override func viewDidLoad() {
super.viewDidLoad()
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
picker.hidden = true
dep.delegate = self
dep.resignFirstResponder()
arr.resignFirstResponder()
//Picker
// Connect data:
self.picker.delegate = self
self.picker.dataSource = self
// Input data into the Array:
pickerData = [["larkspur", "saulsalito", "san francisco", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."],
["san francisco", "saulsalito", "larkspur", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."]]
}
//Mark - Location Delegate Methods
struct MyViewState {
static var count = 8
}
class calculateTime {
var timesArray:[String] = []
var timer: NSTimer!
var count: Int = 0
func refreshView(array: [String]) {
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Hour, .Minute], fromDate: date)
let hour = components.hour
let minutes = components.minute
let currentTime = "\(hour)" + ":" + "\(minutes)"
self.timesArray = array
print(timesArray)
// create a method to convert your time to minutes
func stringToMinutes(input:String) -> Int {
let components = input.componentsSeparatedByString(":")
let hour = Int((components.first ?? "0")) ?? 0
let minute = Int((components.last ?? "0")) ?? 0
return hour*60 + minute
}
//create an array with the minutes from the original array
let timesMinutesArray:[Int] = timesArray.map { stringToMinutes($0) }
let dayMinute = stringToMinutes(currentTime)
// filter out the times that has already passed
let filteredTimesArray = timesMinutesArray.filter{$0 > dayMinute }
// get the first time in your array
if let firstTime = filteredTimesArray.first {
// find its position and extract it from the original array
let nextDeparture = timesArray[timesMinutesArray.indexOf(firstTime)!] // "15:40"
let userCalendar = NSCalendar.currentCalendar()
let dateMakerFormatter = NSDateFormatter()
dateMakerFormatter.calendar = userCalendar
dateMakerFormatter.dateFormat = "yyyy/MM/dd"
// How many hours and minutes between now and the next ferry
dateMakerFormatter.dateFormat = "H:mm"
let startTime = dateMakerFormatter.dateFromString(currentTime)!
let endTime = dateMakerFormatter.dateFromString(nextDeparture)!
let hourMinuteComponents: NSCalendarUnit = [.Hour, .Minute]
let timeDifference = userCalendar.components(
hourMinuteComponents,
fromDate: startTime,
toDate: endTime,
options: [])
let difference = (timeDifference.hour*60) + (timeDifference.minute)
var count = difference
print(count) //this returns correctly
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: ViewController(), selector: "update", userInfo: nil, repeats: true)
}
}
}
//Picker
// The number of columns of data
func numberOfComponentsInPickerView(picker: UIPickerView) -> Int {
return 2
}
// The number of rows of data
func pickerView(picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData[component].count
}
// The data to return for the row and component (column) that's being passed in
func pickerView(picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[component][row]
}
//Show picker wen text field is click in
func textFieldShouldBeginEditing(textfield: UITextField) -> Bool {
dep.resignFirstResponder()
arr.resignFirstResponder()
self.dep.tintColor = UIColor.clearColor()
self.arr.tintColor = UIColor.clearColor()
picker.hidden = false
return false
}
//Make text uneditable
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return false
}
// Catpure the picker view selection
func pickerView(picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
// This method is triggered whenever the user makes a change to the picker selection.
// The parameter named row and component represents what was selected.
print("/[component][row]")
let fromto = pickerData[component][row]
print(fromto)
if component == 0 {
var count = calculateTime().count
arr.text = "san francisco"
dep.text = pickerData[component][row]
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
print("help")
self.countDownLabel.text = "\(count)"
print(count)
}
else {
dep.text = pickerData[component][row]
}
picker.hidden = true;
}
func pickerView(picker: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView
{
var pickerLabel = UILabel()
pickerLabel.textColor = UIColor( red: CGFloat(41/255.0), green: CGFloat(100/255.0), blue: CGFloat(226/255.0), alpha: CGFloat(1.0) )
pickerLabel.text = pickerData[component][row]
// pickerLabel.font = UIFont(name: pickerLabel.font.fontName, size: 15)
pickerLabel.font = UIFont(name: "Helvetica Neue", size: 20) // In this use your custom font
pickerLabel.textAlignment = NSTextAlignment.Center
return pickerLabel
}
func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 36.0
}
func update() {
if count == 1{
//self.minutes.text = "minute"
print("did change")
}
if(count > 0)
{
//countDownLabel.text = String(count--)
print(count)
}
else if (count == 0)
{
timer.invalidate()
print("ended")
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
}
}
}
您应该在文件的最顶部添加count变量,以便所有功能都可以在文件内访问它。 这样,您将只有一个count实例,并且可以从整个文件中的任何位置更新它。 即在文件的顶部:
var count : Int = calculateTime().count
然后,您可以像在
update()
功能。
如果它们在不同的类中,则需要创建该类的实例,或者已经传递了该类的实例。例如,如果count是在类A中初始化的:
public class A {
var count : Int = 0
}
如果要访问类B中的变量,可以执行以下操作:
public class B {
var classA : A = A()
print("Count : \(classA.count)")
}
这将使您可以访问创建的A实例的计数。 另外,创建类B的实例时,可以在初始化时传递类A的适当实例。 例如
public class C {
var a : A = A()
var b : B = B(class : a)
}
public class B {
var count : Int
init(class : A = A()) {
count = class.count
}
}
另外,请记住,在OOP中,您可能希望使用getter和setter,而不只是公开计数并将其私有化。 即
public class A {
private var _count = 0
var count : Int {
get {
return _count
}
set {
if newValue != _count {
_count = newValue
}
}
}
}
public class B {
var classA : A = A()
classA.count = 2 // Would set the count of class A, for the particular instance you have created as 2
}
这也将使您能够访问变量。 另外,如果这对您没有帮助,请查看委托和协议,您也可以通过这种方式传递变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.