2017-04-18 44 views
0

我有一個計算器,我已經在swift中創建。我想向它添加另一個功能,我想將我的historyArray中存儲的操作歷史記錄傳遞到我的TableViewController中。我試圖將數據放大,但似乎無法得到它。我有一些不同的準備,我正在玩的segue方法被註釋掉了。這是我到目前爲止的代碼:Segue historyArray的值到UITableViewController

ViewController.swift

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var displayLabel: UILabel! 
    @IBOutlet weak var HistoryLabel: UILabel! 

    var historyArray: [String] = [] 
    var userIsTypingNumbers = false 
    var firstNumber = 0 
    var secondNumber = 0 
    var operation = "" 
    var result = 0.0 

    @IBAction private func NumbersEntered(_ sender: UIButton) { 

     //know what number is being pressed 
     let number = sender.currentTitle 
     //if user is typing number, do this. 
     if userIsTypingNumbers { 
      //specify what number is being pressed. 
      //append the number onto the previous number. 
      displayLabel.text = displayLabel.text! + number! 
     } else { 
      displayLabel.text = number 
      userIsTypingNumbers = true 
     } 
    } 
    var displayValue: Double { 

     get { 
      return Double(displayLabel.text!)! 
     } 
     set { 
      displayLabel.text = String(newValue) 
     } 
    } 

    private var calculations = PerformCalculations() 


    @IBAction func OperationsPressed(_ sender: UIButton) { 
     userIsTypingNumbers = false 
     firstNumber = Int(Double(displayLabel.text!)!) 
     operation = sender.currentTitle! 
     if operation == "√" { 
      result = (PerformCalculations().squareroot(a: Double(firstNumber))) 
      displayLabel.text = String(result) 
     } 
    } 


    @IBAction func Enter(_ sender: UIButton) { 
     userIsTypingNumbers = false 
     secondNumber = Int(Double(displayLabel.text!)!) 


     if operation == "+" { 
      result = (PerformCalculations().add(a: Double(firstNumber), b: Double(secondNumber))) 
     } else if operation == "÷" { 
      result = (PerformCalculations().division(a: Double(firstNumber), b: Double(secondNumber))) 
     } else if operation == "×" { 
      result = (PerformCalculations().multiplication(a: Double(firstNumber), b: Double(secondNumber))) 
     } else if operation == "-" { 
      result = (PerformCalculations().subtract(a: Double(firstNumber), b: Double(secondNumber))) 
     } 
     displayLabel.text = String(result) 

     historyArray.append("\(firstNumber) \(operation) \(secondNumber) = \(result)") 
     userIsTypingNumbers = false 

     //self.performSegue(withIdentifier: "History", sender: self) 

    } 


    @IBAction func Clear(_ sender: UIButton) { 
     //clear display to 0. 
     displayLabel.text = "0" 
    } 

    @IBAction func Delete(_ sender: UIButton) { 
     //deleting last typed number, if user messed up. 
     let name: String = self.displayLabel.text! 
     //count number of characters. 
     let stringLength = name.characters.count 
     let substringIndex = stringLength - 1 
     displayLabel.text = (name as NSString).substring(to: substringIndex) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // 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. 
    } 

    /*override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "History" { 
      if let destinationVC = segue.destination as? TableTableViewController { 
       destinationVC.dataString = historyArray.description 
      } 
     } 
    }*/ 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let destViewController : TableTableViewController = segue.destination as! TableTableViewController 

     destViewController.dataString = historyArray.description 

    } 
} 

Model.swift

import Foundation 


class PerformCalculations { 

    func add(a: Double, b: Double) -> Double { 
     let result = a + b 
     return result 
    } 
    func division(a: Double, b: Double) -> Double { 
     let result = a/b 
     return result 
    } 
    func subtract(a: Double, b: Double) -> Double { 
     let result = a - b 
     return result 
    } 
    func multiplication(a: Double, b: Double) -> Double { 
     let result = a * b 
     return result 
    } 
    func squareroot(a: Double) -> Double { 
     let result = sqrt(a) 
     return result 
    } 
} 

TableTableViewController.swift

import UIKit 

class TableTableViewController: UITableViewController { 

    //var dataString:String! 

    var historyArray: [String] = [] 
    var i = 0 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     i = 0 
     while i < historyArray.count{ 
      AddLabel(history: historyArray[i]) 
      i = i+1 
     } 

     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

     func AddLabel(history: String){ 
     let label = UILabel() 
     label.text = history 
     let y = i*15 
     label.frame = CGRect(x:125,y:y,width:200,height:21) 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 0 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return 0 
    } 

    /* 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) 

     // Configure the cell... 

     return cell 
    } 
    */ 

    /* 
    // Override to support conditional editing of the table view. 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 
    */ 

    /* 
    // Override to support editing the table view. 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      // Delete the row from the data source 
      tableView.deleteRows(at: [indexPath], with: .fade) 
     } else if editingStyle == .insert { 
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
     }  
    } 
    */ 

    /* 
    // Override to support rearranging the table view. 
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { 

    } 
    */ 

    /* 
    // Override to support conditional rearranging of the table view. 
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the item to be re-orderable. 
     return true 
    } 
    */ 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

任何幫助將不勝感激,謝謝您!

+0

你面臨什麼問題? – KKRocks

+0

我historyArray中的數據沒有傳入我的TableViewController。不知道如果我得到了錯誤的遺傳或我錯過了什麼,我檢查,以確保有我的historyArray數據後,我進行了計算,並有。 – walkerofskies1

回答

0

在您插入的視圖控制器中,您可以使用(self.presentingViewController as? ViewController).historyArray訪問ViewController實例的historyArray

0

爲了讓segue工作,您必須控制從ViewControllerA拖動到Storyboard中的ViewControllerB。選擇你所創建的SEGUE,並給它的「歷史」的標識

現在,您可以手動觸發功能

self.performSegue(withIdentifier: "History", sender: self) 

在裏面SEGUE爲SEGUE準備你必須在你的情況,以檢查標識它的「歷史」

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "History" { 
     if let destinationVC = segue.destination as? TableTableViewController { 
      destinationVC.dataString = historyArray.description 
     } 
    } 
} 

注意:如果您的viewControllerB未包裝或嵌入到Navigationcontroller中,此檢查將起作用。如果是,那麼你必須首先檢查導航控制器然後viewController。

相關問題