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

Posted

技术标签:

【中文标题】将 2 个视图链接到视图控制器的主要问题【英文标题】:Major Issue with linking 2 views to view controller 【发布时间】:2015-07-11 20:10:54 【问题描述】:

我正在制作一个反射测试应用程序,其中一个屏幕是游戏,如果您按下一个按钮,您可以进入另一个屏幕,其中包含一个计分板作为表格视图。我最初使用 cocoa touch 将第二个视图附加到第二个 UIViewController,但问题是,我无法访问第一个 UIViewController 中的任何变量或数据,这是必不可少的(因为表必须重新加载它的数据来自第一个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 个单独的视图控制器,但是有没有办法将它们之间的所有数据链接起来?谢谢。 ​

【问题讨论】:

【参考方案1】:

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

它可以是一个单例,也可以由应用程序委托拥有...以您喜欢的任何方式,以便它可以被需要它的控制器访问。

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

【讨论】:

以上是关于将 2 个视图链接到视图控制器的主要问题的主要内容,如果未能解决你的问题,请参考以下文章

将子视图控制器链接到情节提要中的父视图控制器

iOS - 如何将选项卡与情节提要中的特定视图控制器链接?

无法将连接器从 IBOutlet 链接到视图控制器

将搜索栏单元格标签链接到视图控制器

如何将标签栏项目中的项目链接到另一个视图控制器

你真的可以将约束链接到完全不同的视图控制器吗?