2015-07-11 2 views
0

Я делаю приложение для тестирования рефлекса, где один экран является игрой, и если вы нажмете кнопку, вы можете переходить на другой экран, который содержит табло в виде таблицы. Я сначала привязал второе представление ко второму UIViewController с использованием какао-touch, но проблема была в том, что я не мог получить доступ к какой-либо из переменных или данных в первом 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

Данные, которые необходимо предоставить, не должны находиться внутри контроллера вида. Вместо этого создайте объект для работы в качестве модели данных.

Он может быть одноточечным или может принадлежать делегату приложения ... любым способом, который вам нравится, чтобы к нему могли обращаться требующие его контроллеры.

(У вас может быть даже первый контроллер, владеющий им передачей ссылки на второй контроллер ... но это не очень хорошо масштабируется, так как приложение становится больше.)

Смежные вопросы