2015-07-11 64 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

您需要共享的數據不應位於視圖控制器內。改爲創建一個對象以充當數據模型。

它可以是一個單身人士,或者可以由應用程序委託擁有......無論你喜歡什麼樣的方式,以便它可以由需要它的控制器訪問。

(你甚至可以讓第一個控制器擁有它傳遞給第二個控制器的引用......但是,隨着應用程序變得更大,它不能很好地擴展。)

相關問題