Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将2个视图链接到视图控制器的主要问题_Ios_Xcode_Swift_Xcode6 - Fatal编程技术网

Ios 将2个视图链接到视图控制器的主要问题

Ios 将2个视图链接到视图控制器的主要问题,ios,xcode,swift,xcode6,Ios,Xcode,Swift,Xcode6,我正在制作一个反射测试应用程序,其中一个屏幕是游戏,如果你按下一个按钮,你可以进入另一个屏幕,其中包含一个记分板作为表格视图。我最初使用cocoa touch将第二个视图附加到第二个UIViewController,但问题是,我无法访问第一个UIViewController中的任何变量或数据,这是至关重要的(因为表必须从第一个UIViewController重新加载其数据)。然后我尝试将第二个UIViewController作为第一个UIViewController的子类(我遇到了一些问题),所

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

导入UIKit
类ViewController:UIViewController、UITableViewDelegate{
var arr=[Int]()
var timer=NSTimer()
var countdowntimer=NSTimer()
变量计数=0
var倒计时=整数(arc4random_统一(4000)+1000)
var高分:Int!
var按钮计数器:Int!
让dateFormatter=NSDateFormatter()
@IBVAR开始按钮:UIButton!
@IBVAR表:UITableView!
@IBOutlet弱var重置数据按钮:UIButton!
@IBOutlet弱var平均标签:UILabel!
@IBVAR最佳标签:UILabel!
@IBVAR弱启动按钮:UILabel!
@IBOutlet弱var highScoreButton:UILabel!
@IBVAR时间标签:UILabel!
@IBVAR背景图片:UIImageView!
func updateTime(){
倒计时=倒计时-1
如果倒计时Int{
返回arr.count
}
func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
dateFormatter.dateFormat=“MM/dd/yy HH:MM”
让dateInFormat=dateFormatter.stringFromDate(NSDate())
let cell=UITableViewCell(样式:UITableViewCellStyle.Default,reuseIdentifier:“单元格”)
cell.textLabel?.text=String(arr[indexPath.row])
返回单元
}
func highScoreButtonText(){
//highScoreButton.text=“最佳:\(高分)毫秒”
}
重写func viewDidLoad(){
super.viewDidLoad()
loadDefaults()
highscore=minElement(arr)
highScoreButtonText()
//加载视图后,通常从nib执行任何其他设置。
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
}

问题代码出现在viewDidLoad中,每当我重新加载数据时都会出现。这主要是因为有两个视图。我知道我应该创建两个单独的视图控制器,但有没有办法将它们之间的所有数据链接起来?谢谢。

需要共享的数据不应位于视图控制器内。请创建一个对象作为数据模型

它可以是一个单件,也可以由应用程序代理拥有…无论您喜欢什么方式,以便需要它的控制器可以访问它

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

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.
}