Ios 为什么viewDidLoad()会被调用两次?
由于某种原因,我的数据被保存两次到模型中。为什么Ios 为什么viewDidLoad()会被调用两次?,ios,swift,uitableview,Ios,Swift,Uitableview,由于某种原因,我的数据被保存两次到模型中。为什么viewdidload运行两次?该控制器的用途是作为记分牌。它由使用核心数据的数据填充。我试着删除tablecontroller并添加一个新的 import UIKit class ScoreboardTableViewController: UITableViewController { var model = scoreboardModel.sharedInstance var numbers = [9,12,9]// [In
viewdidload
运行两次?该控制器的用途是作为记分牌。它由使用核心数据的数据填充。我试着删除tablecontroller并添加一个新的
import UIKit
class ScoreboardTableViewController: UITableViewController {
var model = scoreboardModel.sharedInstance
var numbers = [9,12,9]// [Int]()
var timer = "k"
var date = "thedateToday"
override func viewDidLoad() {
super.viewDidLoad()
var count = numbers.count
var x = String(count)
if(timer != "k"){
model.saveScoreboard(date, numsMemorized: x,time: timer)
println("saved!")
}
model.getScoreboards()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return model.scoreboard.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cellll", forIndexPath: indexPath) as UITableViewCell
let score = model.getScore(indexPath)
cell.textLabel!.text = ("\(score.numsMemorized) | \(score.time)")
return cell
}
}
转到ScoreboardTableViewController的视图是:
import UIKit
class PracticeReciteController: UIViewController, UITextFieldDelegate {
var theTime = ""
@IBOutlet weak var howManyCorrect: UILabel!
var numbers = [9,12,9]
var x = 0
@IBOutlet weak var textField: UITextField!
var howManyCorrectNum = 0
override func viewDidLoad() {
super.viewDidLoad()
var outof = numbers.count
howManyCorrect.text = "\(howManyCorrectNum) / \(outof)"
textField.delegate = self;
textField.addTarget(self, action:"edited", forControlEvents:UIControlEvents.EditingChanged)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func edited() {
//[todo] if on last number in array & correct. endgame/collectscore
var userInput = textField.text.toInt()
if numbers[x] == userInput{
if x+1 == numbers.count{
performSegueWithIdentifier("scoreboardIdentifier", sender: self)
}
//println("correct")
x++
howManyCorrect.text = String(x) + "/" + String(numbers.count)
//I set here timer so if user enter correct input then it will remove text after some time
var timer = NSTimer.scheduledTimerWithTimeInterval(0.8, target: self, selector: Selector("resetText"), userInfo: nil, repeats: false)
}else if userInput?.isDouble() == numbers[x].isDouble(){
println("incorrect")
}
else{
println("huh?")
}
}
//This method will call after some time use if user enter correct input
func resetText(){
textField.text = ""
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
var DestViewController = segue.destinationViewController as ScoreboardTableViewController
DestViewController.numbers = numbers
DestViewController.timer = theTime
}
}
这个问题以前被回答过很多次:
无论如何,给你一个重要的建议:不要在
viewDidLoad
中放入任何会破坏你的应用程序/数据的代码。viewdiload
在ViewController的生命周期中不会被假定只调用一次这是一个老问题,但我发现
在Swift中,如果访问uiviewcontroller的视图,如
enter @IBOutlet weak var searchTextField: UITextField! {
didSet {
self.searchTextField.borderStyle = .none
self.searchTextField.keyboardType = .default
self.searchTextField.placeholder = "Search"
let width = (self.view.frame.width - 114)
self.searchTextField.frame = CGRect.init(origin: searchTextField.frame.origin, size: CGSize.init(width: width, height: searchTextField.frame.height))
}
}
然后,它将在该阶段首先调用viewDidLoad,然后将viewDidLoad作为生命周期调用。我们必须了解如何从外部使用vc。你最好在你的问题中添加一些代码。你是什么意思?它是一个表格控制器。每个单元格显示模型中的数据。如何初始化和显示此VC。添加了segue控制器。尽管有可能重复,但这是一个设计(架构)问题