将 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 个视图链接到视图控制器的主要问题的主要内容,如果未能解决你的问题,请参考以下文章