我正在制作一个反射测试应用程序,其中一个屏幕是游戏,如果你按一个按钮,你可以进入另一个屏幕,其中包含一个记分板作为表格视图。我最初使用cocoa touch将第二个视图附加到第二个UIViewController
,但问题是,我无法访问第一个UIViewController
中的任何变量或数据,这是必不可少的(因为table必须从第一个UIViewController
重新加载其数据。然后我尝试将第二个UIViewController
作为第一个UIViewController
的子类(我遇到了问题),所以我放弃了这个想法。现在两个视图都连接到一个UIViewController
,我遇到了多个问题。首先,当尝试执行功能并更改屏幕中不存在的数据值时(IE:在视图上重新加载表数据时会加载,这会导致错误,因为屏幕上没有表格)。有没有解决方案,是否有办法将一个视图控制器中的所有数据连接到另一个视图控制器?谢谢。
这是代码(它在1 UIViewController
)
import UIKit
class ViewController: UIViewController, UITableViewDelegate {
var arr = [Int]()
var timer = NSTimer()
var countdowntimer = NSTimer()
var count = 0
var countdown = Int(arc4random_uniform(4000) + 1000)
var highscore:Int!
var buttonTapCounter:Int!
let dateFormatter = NSDateFormatter()
@IBOutlet weak var beginButton: UIButton!
@IBOutlet weak var table: UITableView!
@IBOutlet weak var resetDataButton: UIButton!
@IBOutlet weak var averageLabel: UILabel!
@IBOutlet weak var bestLabel: UILabel!
@IBOutlet weak var startButton: UILabel!
@IBOutlet weak var highScoreButton: UILabel!
@IBOutlet weak var timerLabel: UILabel!
@IBOutlet weak var backgroundImage: UIImageView!
func updateTime() {
countdown = countdown - 1
if countdown <= 0 {
startButton.textColor = UIColor.blackColor()
startButton.text = "Tap Now!"
countdowntimer.invalidate()
backgroundImage.image = UIImage(named: "red")
count = 0
Timer()
}
}
func Timer() {
timer = NSTimer.scheduledTimerWithTimeInterval(0.001, target:self, selector:Selector("reflexTest"), userInfo:nil, repeats: true)
}
func reflexTest() {
count = count + 1
timerLabel.text = "\(count) ms"
}
@IBAction func returnPressed(sender: AnyObject) {
buttonTapCounter = 0
}
@IBAction func scoreButtonTouched(sender: AnyObject) {
table.reloadData()
}
@IBAction func beginTapped(sender: AnyObject) {
if startButton.text == "Tap when the Color Changes" {
startButton.text = "You tapped too early!"
countdowntimer.invalidate()
countdown = Int(arc4random_uniform(4000) + 1000)
} else {
if count == 0 {
countdowntimer = NSTimer.scheduledTimerWithTimeInterval(0.001, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
startButton.text = "Tap when the Color Changes"
countdown = Int(arc4random_uniform(4000) + 1000)
timerLabel.text = "\(count) ms"
} else {
timer.invalidate()
backgroundImage.image = UIImage(named: "green")
startButton.text = "Tap to Begin"
arr.append(count)
count = 0
highscore = minElement(arr)
highScoreButton.text = "Best: \(highscore) ms"
saveDefaults()
loadDefaults()
}
}
}
func loadDefaults() {
if let savedArray = NSUserDefaults.standardUserDefaults().objectForKey("data") as? [Int] {
self.arr = savedArray
}
}
func saveDefaults() {
NSUserDefaults.standardUserDefaults().setObject(self.arr, forKey: "data")
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arr.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
dateFormatter.dateFormat = "MM/dd/yy HH:mm"
let dateInFormat = dateFormatter.stringFromDate(NSDate())
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
cell.textLabel?.text = String(arr[indexPath.row])
return cell
}
func highScoreButtonText() {
//highScoreButton.text = "Best: \(highscore) ms"
}
override func viewDidLoad() {
super.viewDidLoad()
loadDefaults()
highscore = minElement(arr)
highScoreButtonText()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
有问题的代码在viewDidLoad中,每当我重新加载数据时。这主要是因为有2个观点。我知道我应该创建2个独立的视图控制器,但有没有办法链接它们之间的所有数据?谢谢。
答案 0 :(得分:0)
您需要共享的数据不应位于视图控制器内。创建一个对象作为数据模型。
它可以是单身,也可以由app委托拥有......无论你喜欢什么样的方式,它都可以被需要它的控制器访问。
(你甚至可以让第一个控制器拥有它传递给第二个控制器的引用......但是当应用变大时,它不能很好地扩展。)