2016-05-31 2 views
0

Ich versuche, eine einfache Times Table App (für Nummern 1-9) in Swift) mithilfe eines Schiebereglers und einer Tabellenansicht zu erstellen. Ich schaffe es, den Schieberegler zu arbeiten und ein Array für jede Nummer zu erstellen, die mit dem Schieberegler ausgewählt wird und obwohl das Array auf der Konsole angezeigt wird. Ich kann die Zahlen nicht in der Tabellenansicht anzeigen. Kannst du mir bitte helfen und mir sagen, was ich vermisse? HierKann Tabellenansicht Daten in einer einfachen Times Table App nicht anzeigen

ist das, was ich geschrieben habe, so weit:

class ViewController: UIViewController, UITableViewDelegate { 

    @IBOutlet var sliderValue: UISlider! 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 9 
    } 

    @IBAction func sliderMoved(sender: UISlider) { 
     sender.setValue(Float(lroundf(sliderValue.value)), animated: true) 

     print(sliderValue) 

     var cellContent = [String]() 

     for var i = 1; i <= 10; i += 1 { 
      cellContent.append(String(i * Int(sliderValue.value))) 
     } 

     print(cellContent) 

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") 

      cell.textLabel?.text = cellContent[indexPath.row] 

      return cell 
     } 
    } 

    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. 
    } 
} 
+0

Der Code, den Sie geliefert haben eigentlich nicht zu einem Tableview beziehen noch die Tableview Delegierter und Datasource einzurichten. Desweiteren hält sich Ihre Klasse an das 'UITableViewDelegate' Protokoll, implementiert aber tatsächlich mehrere' UITableViewDataSource' Funktionen, die wahrscheinlich nicht viel nutzen werden ... –

Antwort

1

Ich fürchte, es gibt eine ganze Menge in dem Code, den Sie angegeben haben, die nicht allzu viel Sinn macht. Ich habe einige davon in meinem Kommentar oben erwähnt, aber Sie haben auch eine TableViewDataSource-Funktion in Ihrer sliderMoved-Funktion verschachtelt. Die gesamte Array-Sache sieht ziemlich flackerig aus, und die vorgeschlagene Zellenanzahl berücksichtigt nicht wirklich die Größe des Arrays. Ich glaube, Sie wahrscheinlich so etwas wie dies wollen:

class ViewController: UIViewController, UITableViewDataSource { 
    @IBOutlet var valueSlider: UISlider! 
    @IBOutlet var tableView: UITableView! 
    private var cellContent = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.dataSource = self 
    } 

    @IBAction func sliderMoved(sender: UISlider) { 
     sender.setValue(Float(lroundf(valueSlider.value)), animated: true) 
     tableView.reloadData() 
    } 

    // TableViewDataSource 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 9 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") // Must exist with the same identifier in your storyboard 
     cell.textLabel?.text = valueStringForIndex(indexPath.row) 

     return cell 
    } 

    // Private functions 

    private func valueStringForIndex(index: Int) -> String { 
     return "\(index * Int(valueSlider.value))" 
    } 
} 
+0

Zunächst möchte ich Ihnen für Ihre schnelle Antwort danken. Nun, ich war mir fast sicher, dass ich etwas falsch schreiben könnte, da ich kürzlich angefangen habe, schnell zu lernen, und was ich tue, ist, die Dinge, die ich lerne, aus einem Kurs, den ich online mache, zu lernen Wenige Dinge zur gleichen Zeit.Das heißt, ich weiß, dass ich diese Methode in der anderen verschachtelt habe, aber ich habe nur versucht, den Code zum Laufen zu bringen, und das wurde in dem Moment gedacht, als ich die Frage gepostet habe. Vielen Dank für die Antwort, es funktioniert, obwohl ich immer noch versuche zu verstehen, wie ein paar Dinge funktionieren. – Ioannis

1

Haben Sie cellContent Array als Instanzvariable versucht, die Erstellung und den folgenden Code arbeiten kann. Überprüfen Sie es einmal.

var cellContent = [String]() 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 9 
} 

@IBAction func sliderMoved(sender: UISlider) { 
    sender.setValue(Float(lroundf(sliderValue.value)), animated: true) 

    print(sliderValue) 



    for var i = 1; i <= 10; i += 1 { 
     cellContent.append(String(i * Int(sliderValue.value))) 
    } 

    print(cellContent) 

    self.tableview.reloadData() 
} 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") 

     cell.textLabel?.text = cellContent[indexPath.row] 

     return cell 
    } 
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. 
} 

}

+0

Das hatte ich mir schon gedacht und es vor dem Stellen meiner Frage versucht (es war auch ein Empfehlung von Xcode). Aber tatsächlich, es ist ein viel größeres Problem, wenn ich versuche, den Code auszuführen und es stürzt die App ab. Danke trotzdem! – Ioannis

0

Obwohl nicht direkt eine Antwort auf Ihre Frage ->

Je nachdem, wie Sie wollen, dass die Tabelle angezeigt, ein UICollectionView kann ein großer fit für diese sein Anwendung. Sehr ähnlich zu UITableView zu implementieren, aber mit Boxen und Spalten von Daten, möglicherweise einfacher zu formatieren (und Änderung des Sliders könnte einige lustige Animation hinzufügen, wenn die Sammlung anzeigen aktualisiert).

Der folgende Beispiel-UIViewController demonstriert die Verwendung einer UICollectionView. Im Storyboard, habe ich einfach:

  • Added eine UISlider, UICollectionView und UILabel und erstellt Filialen in MultiplicationTableViewController
  • In der UICollectionView Standardzelle ich den reuseIdentifier "numberCell" gab, und fügte hinzu, ein Etikett (halten das Produkt)
  • die MultiplicationTableViewController der Datenquelle und Delegierter für die
  • UICollectionView Hergestellt

Code:

import UIKit 

class MultiplicationTableViewController: UIViewController { 

    @IBOutlet var timesTableCollectionView: UICollectionView! 
    @IBOutlet weak var numberSlider: UISlider! 
    @IBOutlet weak var label: UILabel! 

    var products = [Int]() //array to hold the computed value for each cell in the collectionView 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.viewRotated), name: UIDeviceOrientationDidChangeNotification, object: nil) //register for rotation notifications 
    products = createTableOfValues()    //populate products with initial values 
    label.text = "\(Int(numberSlider.value)) x \(Int(numberSlider.value))" 
    } 

    @IBAction func sliderUpdated(sender: UISlider) { 
    sender.value = Float(Int(sender.value))  //make the slider stop only on whole numbers 
    label.text = "\(Int(sender.value)) x \(Int(sender.value))" 
    products = createTableOfValues()    //create the new table values 
    timesTableCollectionView.reloadData()  //tell the collectionView to read the new data and refresh itself 
    } 

    func createTableOfValues() -> [Int] { 
    var prod = [Int]()       //temp array to hold the generated products 
    for row in 0...Int(numberSlider.value) {  //iterate from row 0 (header) to 
     var columns = [Int]()      //temp array to build column products 
     for column in 0...Int(numberSlider.value) {//iterate through each column, including column 0 (header) 
     if column == 0 { 
      columns.append(row) 
     } else if row == 0 { 
      columns.append(column) 
     } else { 
      columns.append(column * row) 
     } 
     } 
     prod.appendContentsOf(columns)    //add the current row of products to the temp array 
    } 
    return prod 
    } 

    func viewRotated() { 
    timesTableCollectionView.reloadData()  //called to force collectionView to recalc (basically to get new cell sizes 
    } 
} 

extension MultiplicationTableViewController: UICollectionViewDataSource { 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return 1         //required for UICollectionViewDataSource 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return Int(numberSlider.value + 1) * Int(numberSlider.value + 1) //tells the UICollectionView how many cells to draw (the number on the slider, plus header rows) 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("numberCell", forIndexPath: indexPath) //get an existing cell if it exists 
    if cell.frame.origin.y == 0.0 || cell.frame.origin.x == 0.0 {  //if the cell is at the top or left of the collectionView 
     cell.backgroundColor = UIColor.yellowColor() 
    } else { 
     cell.backgroundColor = UIColor.clearColor()      //If not, reset the color (required because cells are reused 
    } 
    cell.layer.borderColor = UIColor.blackColor().CGColor 
    cell.layer.borderWidth = 1.0 
    let numberItem = cell.viewWithTag(101) as? UILabel    //get a reference to the label in the current cell 
    numberItem?.text = String(products[indexPath.row])    //get the value generated earlier for this particular cell 
    return cell 
    } 
} 

extension MultiplicationTableViewController: UICollectionViewDelegateFlowLayout { 
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    let columns = CGFloat(numberSlider.value + 1)      //get the number of columns - slider value + 1 for header 
    let width = timesTableCollectionView.bounds.width/columns   //divide the width of the collectionView by the number of columns 
    return CGSizeMake(width, width)          //use width value to make the cell a square 
    } 
} 

Screenshot: enter image description here

+0

Wie ich schon in einem anderen Kommentar erwähnt habe, bin ich neu bei swift und mache iOS-Apps, also ist jede neue und/oder andere Art, etwas zu machen, immer interessant. Ich würde sicherlich gerne sehen, wie es anders umgesetzt werden könnte, so dass Sie mehr als willkommen sind, den Code oder Ressourcen oder was auch immer Sie denken, zu helfen. Vielen Dank im Voraus! – Ioannis

+0

Ich werde das Projekt später auf gitHub veröffentlichen, wenn Sie es weiter betrachten möchten. – DJohnson

Verwandte Themen