[英]Why is viewDidLoad() getting called twice?
For some reason my data is being save twice to the model.出于某种原因,我的数据被两次保存到模型中。 why is
viewdidload
running twice?为什么
viewdidload
运行两次? this controller purpose is to be a scoreboard.这个控制器的目的是成为一个记分牌。 it is populated by data using core data.
它由使用核心数据的数据填充。 Ive tried deleting the tablecontroller and adding a new one.
我试过删除 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
}
}
The view that segues to the ScoreboardTableViewController is:与 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
}
}
The question was being answered many times before : viewDidLoad getting called twice on rootViewController at launch这个问题之前被多次回答: viewDidLoad 在启动时在 rootViewController 上被调用两次
viewDidLoad is called twice viewDidLoad 被调用两次
Anyway, one important advice for you: don't put any code that will broke your app/data in viewDidLoad
.无论如何,给您一个重要的建议:不要在
viewDidLoad
放置任何会破坏您的应用程序/数据的代码。 The viewDidLoad
not assumed to be called only once in ViewController's lifecycle viewDidLoad
不会假设在 ViewController 的生命周期中只调用一次
This is old issue, but what I found is ..这是老问题,但我发现的是..
In Swift, if you access the view of uiviewcontroller like在 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))
}
}
Then it will call viewDidLoad in that stage first, then it will call viewDidLoad as lifecycle.然后它会首先在那个阶段调用 viewDidLoad,然后它会调用 viewDidLoad 作为生命周期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.