2015-07-11 23 views
0

我正在制作一个反射测试应用程序,其中一个屏幕是游戏,如果按下按钮,则可以插入另一个屏幕,该屏幕包含作为表格视图的记分板。我最初使用cocoa touch将第二个视图附加到第二个视图UIViewController,但问题是,我无法访问第一个UIViewController中的任何变量或数据,这是非常重要的(因为表必须将数据从第一个UIViewController)。然后我试图将第二个UIViewController作为第一个UIViewController的一个子类(并且我遇到了问题),所以我放弃了这个想法。现在这两个视图都连接到一个UIViewController,我面临着多个问题。首先,当试图执行功能和更改屏幕上不存在的数据值(IE:重新加载视图上的表数据确实加载,这会导致错误,因为表不存在于屏幕上)时。有没有解决方案,有没有办法将一个视图控制器中的所有数据连接到另一个?谢谢。 下面是代码(它在1 UIViewController将2个视图链接到视图控制器的主要问题

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

您需要共享的数据不应位于视图控制器内。改为创建一个对象以充当数据模型。

它可以是一个单身人士,或者可以由应用程序委托拥有......无论你喜欢什么样的方式,以便它可以由需要它的控制器访问。

(你甚至可以让第一个控制器拥有它传递给第二个控制器的引用......但是,随着应用程序变得更大,它不能很好地扩展。)

相关问题