【问题标题】:Why is viewDidLoad() getting called twice?为什么 viewDidLoad() 被调用两次?
【发布时间】:2015-12-24 02:57:34
【问题描述】:

由于某种原因,我的数据被两次保存到模型中。为什么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


}

} 

【问题讨论】:

  • 了解您如何从外部使用 vc 对我们来说很重要。您最好在问题中添加一些代码。
  • 什么意思?它是一个表控制器。每个单元格显示来自模型的数据。
  • 你如何初始化和呈现这个VC。
  • 添加了 segue 控制器。

标签: ios swift uitableview


【解决方案1】:

这个问题之前被回答了很多次: viewDidLoad getting called twice on rootViewController at launch

viewDidLoad is called twice

无论如何,给您的一个重要建议是:不要在viewDidLoad 中放置任何会破坏您的应用/数据的代码。 viewDidLoad 不假定在 ViewController 的生命周期中只被调用一次

【讨论】:

  • 尽管有原因,这是一个设计(架构)问题
【解决方案2】:

这是老问题,但我发现的是..

在 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作为生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2021-11-25
    • 2012-12-10
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多