Printing Contents of TableView in Swift IOS Application
I am making an app with a scene that contains a tableview. Each cell in the table view contains a rating control (made up of 5 stars) and a label. At the click of a button I would like to print all of the labels as well as the number of stars that user has clicked from the rating controls from the entire table view. to the console.
How can I do this?
Here is my tableview(_:cellForRowAt:) method
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Configure the cell
    // Table view cells are reused and should be dequeued using a cell identifier
    let cellId = "cell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? MatchingTableViewCell else {
        fatalError("The dequeued cell is not an instacne of MatchingTableViewCell")
    }
    // Fetches the appropriate match for the data source layout.
    let match = matching[indexPath.row]
    cell.nameLabel.text = match.name
    cell.photoImagView.image = match.photo
    cell.ratingControl.rating = match.rating
    return cell
}
Data model object is an array of structs of Match objects:
import Foundation
import UIKit
import os.log
class Match: NSObject, NSCoding {
// MARK: Properties
var name: String
var photo: UIImage?
var rating: Int
// MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first
static let ArchiveURL = DocumentsDirectory?.appendingPathComponent("matching")
// MARK: Types
struct PropertyKey {
    static let name = "name"
    static let photo = "photo"
    static let rating = "rating"
}
init?(name: String, photo: UIImage?, rating: Int) {
    // The name must not be empty
    guard !name.isEmpty else{
        return nil
    }
    // The rating must be between 0 and 5 inclusively
    guard (rating >= 0) && (rating <= 5) else {
        return nil
    }
    // Initialize stored properties
    self.name = name
    self.photo = photo
    self.rating = rating
}
override var description : String {
    return "rating (self.rating) n"
}
// MARK: NSCoding
func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(photo, forKey: PropertyKey.photo)
    aCoder.encode(rating, forKey: PropertyKey.rating)
}
required convenience init?(coder aDecoder: NSCoder) {
    // The name is required if we cannot decode a name string, the init should fail
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else{
        os_log("Unable to decode the name for a Match object", log: OSLog.default, type: .debug)
        return nil
    }
    // Because the photo is an optional property of Match, just use conditional cast.
    let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage
    let rating = aDecoder.decodeObject(forKey: PropertyKey.rating)
    // Must call designated init
    self.init(name: name, photo: photo, rating: rating as! Int)
}
}
RatingControl.swiift:
import UIKit
@IBDesignable class RatingControl: UIStackView {
// MARK: Properties
private var ratingButtons = [UIButton]()
var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}
@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0) {// Defines size of buttons/
    didSet{
        setupButtons()
    }
}
@IBInspectable var starCount: Int = 5 {// Defines number of buttons
    didSet{
        setupButtons()
    }
}
// MARK: Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}
required init(coder: NSCoder) {
    super.init(coder: coder)
    setupButtons()
}
      // MARK: Private Methods
private func setupButtons(){
    // Clear any existing buttons
    for button in ratingButtons{
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    ratingButtons.removeAll()
    // Load Button Images
    let bundle = Bundle(for: type(of: self))
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let emptyStar = UIImage(named: "emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let highligtedStar = UIImage(named: "highlightedStar", in: bundle, compatibleWith: self.traitCollection)
    for _ in 0..<starCount {
    // Create the button
    let button = UIButton()
    // Set the button images
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highligtedStar, for: .highlighted)
        button.setImage(highligtedStar, for: [.highlighted, .selected])
    // Adding constraints
    button.translatesAutoresizingMaskIntoConstraints = false // disables buttons automatically generated constraints
    button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true // defines height
    button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true // defines width
    //Setup the button action
    button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)
    // Add button to stack
    addArrangedSubview(button)
    // Add the new button to the rating button Array
    ratingButtons.append(button)
    }
    updateButtonSelectionStates()
}
// MARK: Button Action
@objc func ratingButtonTapped(button:UIButton){
    guard let index = ratingButtons.index(of: button) else {
        fatalError("The button, (button), is not in the ratingButtons array: (ratingButtons)")
    }
    // Calculate the rating of the selected button
    let selectedRating = index + 1
    if selectedRating == rating { // If the selected star represents the current rating, reset the rating to 0
        rating = 0
    } else{
        // Otherwise set the rating to the selected star
        rating = selectedRating
    }
}
private func updateButtonSelectionStates() { // Update buttons appearance
    for (index, button) in ratingButtons.enumerated() {
        // If the index of a button is less than the rating, that button should be selected
        button.isSelected = index < rating
    }
}
}
ios swift uitableview
add a comment |
I am making an app with a scene that contains a tableview. Each cell in the table view contains a rating control (made up of 5 stars) and a label. At the click of a button I would like to print all of the labels as well as the number of stars that user has clicked from the rating controls from the entire table view. to the console.
How can I do this?
Here is my tableview(_:cellForRowAt:) method
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Configure the cell
    // Table view cells are reused and should be dequeued using a cell identifier
    let cellId = "cell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? MatchingTableViewCell else {
        fatalError("The dequeued cell is not an instacne of MatchingTableViewCell")
    }
    // Fetches the appropriate match for the data source layout.
    let match = matching[indexPath.row]
    cell.nameLabel.text = match.name
    cell.photoImagView.image = match.photo
    cell.ratingControl.rating = match.rating
    return cell
}
Data model object is an array of structs of Match objects:
import Foundation
import UIKit
import os.log
class Match: NSObject, NSCoding {
// MARK: Properties
var name: String
var photo: UIImage?
var rating: Int
// MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first
static let ArchiveURL = DocumentsDirectory?.appendingPathComponent("matching")
// MARK: Types
struct PropertyKey {
    static let name = "name"
    static let photo = "photo"
    static let rating = "rating"
}
init?(name: String, photo: UIImage?, rating: Int) {
    // The name must not be empty
    guard !name.isEmpty else{
        return nil
    }
    // The rating must be between 0 and 5 inclusively
    guard (rating >= 0) && (rating <= 5) else {
        return nil
    }
    // Initialize stored properties
    self.name = name
    self.photo = photo
    self.rating = rating
}
override var description : String {
    return "rating (self.rating) n"
}
// MARK: NSCoding
func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(photo, forKey: PropertyKey.photo)
    aCoder.encode(rating, forKey: PropertyKey.rating)
}
required convenience init?(coder aDecoder: NSCoder) {
    // The name is required if we cannot decode a name string, the init should fail
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else{
        os_log("Unable to decode the name for a Match object", log: OSLog.default, type: .debug)
        return nil
    }
    // Because the photo is an optional property of Match, just use conditional cast.
    let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage
    let rating = aDecoder.decodeObject(forKey: PropertyKey.rating)
    // Must call designated init
    self.init(name: name, photo: photo, rating: rating as! Int)
}
}
RatingControl.swiift:
import UIKit
@IBDesignable class RatingControl: UIStackView {
// MARK: Properties
private var ratingButtons = [UIButton]()
var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}
@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0) {// Defines size of buttons/
    didSet{
        setupButtons()
    }
}
@IBInspectable var starCount: Int = 5 {// Defines number of buttons
    didSet{
        setupButtons()
    }
}
// MARK: Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}
required init(coder: NSCoder) {
    super.init(coder: coder)
    setupButtons()
}
      // MARK: Private Methods
private func setupButtons(){
    // Clear any existing buttons
    for button in ratingButtons{
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    ratingButtons.removeAll()
    // Load Button Images
    let bundle = Bundle(for: type(of: self))
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let emptyStar = UIImage(named: "emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let highligtedStar = UIImage(named: "highlightedStar", in: bundle, compatibleWith: self.traitCollection)
    for _ in 0..<starCount {
    // Create the button
    let button = UIButton()
    // Set the button images
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highligtedStar, for: .highlighted)
        button.setImage(highligtedStar, for: [.highlighted, .selected])
    // Adding constraints
    button.translatesAutoresizingMaskIntoConstraints = false // disables buttons automatically generated constraints
    button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true // defines height
    button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true // defines width
    //Setup the button action
    button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)
    // Add button to stack
    addArrangedSubview(button)
    // Add the new button to the rating button Array
    ratingButtons.append(button)
    }
    updateButtonSelectionStates()
}
// MARK: Button Action
@objc func ratingButtonTapped(button:UIButton){
    guard let index = ratingButtons.index(of: button) else {
        fatalError("The button, (button), is not in the ratingButtons array: (ratingButtons)")
    }
    // Calculate the rating of the selected button
    let selectedRating = index + 1
    if selectedRating == rating { // If the selected star represents the current rating, reset the rating to 0
        rating = 0
    } else{
        // Otherwise set the rating to the selected star
        rating = selectedRating
    }
}
private func updateButtonSelectionStates() { // Update buttons appearance
    for (index, button) in ratingButtons.enumerated() {
        // If the index of a button is less than the rating, that button should be selected
        button.isSelected = index < rating
    }
}
}
ios swift uitableview
add a comment |
I am making an app with a scene that contains a tableview. Each cell in the table view contains a rating control (made up of 5 stars) and a label. At the click of a button I would like to print all of the labels as well as the number of stars that user has clicked from the rating controls from the entire table view. to the console.
How can I do this?
Here is my tableview(_:cellForRowAt:) method
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Configure the cell
    // Table view cells are reused and should be dequeued using a cell identifier
    let cellId = "cell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? MatchingTableViewCell else {
        fatalError("The dequeued cell is not an instacne of MatchingTableViewCell")
    }
    // Fetches the appropriate match for the data source layout.
    let match = matching[indexPath.row]
    cell.nameLabel.text = match.name
    cell.photoImagView.image = match.photo
    cell.ratingControl.rating = match.rating
    return cell
}
Data model object is an array of structs of Match objects:
import Foundation
import UIKit
import os.log
class Match: NSObject, NSCoding {
// MARK: Properties
var name: String
var photo: UIImage?
var rating: Int
// MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first
static let ArchiveURL = DocumentsDirectory?.appendingPathComponent("matching")
// MARK: Types
struct PropertyKey {
    static let name = "name"
    static let photo = "photo"
    static let rating = "rating"
}
init?(name: String, photo: UIImage?, rating: Int) {
    // The name must not be empty
    guard !name.isEmpty else{
        return nil
    }
    // The rating must be between 0 and 5 inclusively
    guard (rating >= 0) && (rating <= 5) else {
        return nil
    }
    // Initialize stored properties
    self.name = name
    self.photo = photo
    self.rating = rating
}
override var description : String {
    return "rating (self.rating) n"
}
// MARK: NSCoding
func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(photo, forKey: PropertyKey.photo)
    aCoder.encode(rating, forKey: PropertyKey.rating)
}
required convenience init?(coder aDecoder: NSCoder) {
    // The name is required if we cannot decode a name string, the init should fail
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else{
        os_log("Unable to decode the name for a Match object", log: OSLog.default, type: .debug)
        return nil
    }
    // Because the photo is an optional property of Match, just use conditional cast.
    let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage
    let rating = aDecoder.decodeObject(forKey: PropertyKey.rating)
    // Must call designated init
    self.init(name: name, photo: photo, rating: rating as! Int)
}
}
RatingControl.swiift:
import UIKit
@IBDesignable class RatingControl: UIStackView {
// MARK: Properties
private var ratingButtons = [UIButton]()
var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}
@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0) {// Defines size of buttons/
    didSet{
        setupButtons()
    }
}
@IBInspectable var starCount: Int = 5 {// Defines number of buttons
    didSet{
        setupButtons()
    }
}
// MARK: Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}
required init(coder: NSCoder) {
    super.init(coder: coder)
    setupButtons()
}
      // MARK: Private Methods
private func setupButtons(){
    // Clear any existing buttons
    for button in ratingButtons{
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    ratingButtons.removeAll()
    // Load Button Images
    let bundle = Bundle(for: type(of: self))
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let emptyStar = UIImage(named: "emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let highligtedStar = UIImage(named: "highlightedStar", in: bundle, compatibleWith: self.traitCollection)
    for _ in 0..<starCount {
    // Create the button
    let button = UIButton()
    // Set the button images
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highligtedStar, for: .highlighted)
        button.setImage(highligtedStar, for: [.highlighted, .selected])
    // Adding constraints
    button.translatesAutoresizingMaskIntoConstraints = false // disables buttons automatically generated constraints
    button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true // defines height
    button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true // defines width
    //Setup the button action
    button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)
    // Add button to stack
    addArrangedSubview(button)
    // Add the new button to the rating button Array
    ratingButtons.append(button)
    }
    updateButtonSelectionStates()
}
// MARK: Button Action
@objc func ratingButtonTapped(button:UIButton){
    guard let index = ratingButtons.index(of: button) else {
        fatalError("The button, (button), is not in the ratingButtons array: (ratingButtons)")
    }
    // Calculate the rating of the selected button
    let selectedRating = index + 1
    if selectedRating == rating { // If the selected star represents the current rating, reset the rating to 0
        rating = 0
    } else{
        // Otherwise set the rating to the selected star
        rating = selectedRating
    }
}
private func updateButtonSelectionStates() { // Update buttons appearance
    for (index, button) in ratingButtons.enumerated() {
        // If the index of a button is less than the rating, that button should be selected
        button.isSelected = index < rating
    }
}
}
ios swift uitableview
I am making an app with a scene that contains a tableview. Each cell in the table view contains a rating control (made up of 5 stars) and a label. At the click of a button I would like to print all of the labels as well as the number of stars that user has clicked from the rating controls from the entire table view. to the console.
How can I do this?
Here is my tableview(_:cellForRowAt:) method
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Configure the cell
    // Table view cells are reused and should be dequeued using a cell identifier
    let cellId = "cell"
    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? MatchingTableViewCell else {
        fatalError("The dequeued cell is not an instacne of MatchingTableViewCell")
    }
    // Fetches the appropriate match for the data source layout.
    let match = matching[indexPath.row]
    cell.nameLabel.text = match.name
    cell.photoImagView.image = match.photo
    cell.ratingControl.rating = match.rating
    return cell
}
Data model object is an array of structs of Match objects:
import Foundation
import UIKit
import os.log
class Match: NSObject, NSCoding {
// MARK: Properties
var name: String
var photo: UIImage?
var rating: Int
// MARK: Archiving Paths
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first
static let ArchiveURL = DocumentsDirectory?.appendingPathComponent("matching")
// MARK: Types
struct PropertyKey {
    static let name = "name"
    static let photo = "photo"
    static let rating = "rating"
}
init?(name: String, photo: UIImage?, rating: Int) {
    // The name must not be empty
    guard !name.isEmpty else{
        return nil
    }
    // The rating must be between 0 and 5 inclusively
    guard (rating >= 0) && (rating <= 5) else {
        return nil
    }
    // Initialize stored properties
    self.name = name
    self.photo = photo
    self.rating = rating
}
override var description : String {
    return "rating (self.rating) n"
}
// MARK: NSCoding
func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(photo, forKey: PropertyKey.photo)
    aCoder.encode(rating, forKey: PropertyKey.rating)
}
required convenience init?(coder aDecoder: NSCoder) {
    // The name is required if we cannot decode a name string, the init should fail
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else{
        os_log("Unable to decode the name for a Match object", log: OSLog.default, type: .debug)
        return nil
    }
    // Because the photo is an optional property of Match, just use conditional cast.
    let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage
    let rating = aDecoder.decodeObject(forKey: PropertyKey.rating)
    // Must call designated init
    self.init(name: name, photo: photo, rating: rating as! Int)
}
}
RatingControl.swiift:
import UIKit
@IBDesignable class RatingControl: UIStackView {
// MARK: Properties
private var ratingButtons = [UIButton]()
var rating = 0 {
    didSet {
        updateButtonSelectionStates()
    }
}
@IBInspectable var starSize: CGSize = CGSize(width: 44.0, height: 44.0) {// Defines size of buttons/
    didSet{
        setupButtons()
    }
}
@IBInspectable var starCount: Int = 5 {// Defines number of buttons
    didSet{
        setupButtons()
    }
}
// MARK: Initialization
override init(frame: CGRect) {
    super.init(frame: frame)
    setupButtons()
}
required init(coder: NSCoder) {
    super.init(coder: coder)
    setupButtons()
}
      // MARK: Private Methods
private func setupButtons(){
    // Clear any existing buttons
    for button in ratingButtons{
        removeArrangedSubview(button)
        button.removeFromSuperview()
    }
    ratingButtons.removeAll()
    // Load Button Images
    let bundle = Bundle(for: type(of: self))
    let filledStar = UIImage(named: "filledStar", in: bundle, compatibleWith: self.traitCollection)
    let emptyStar = UIImage(named: "emptyStar", in: bundle, compatibleWith: self.traitCollection)
    let highligtedStar = UIImage(named: "highlightedStar", in: bundle, compatibleWith: self.traitCollection)
    for _ in 0..<starCount {
    // Create the button
    let button = UIButton()
    // Set the button images
        button.setImage(emptyStar, for: .normal)
        button.setImage(filledStar, for: .selected)
        button.setImage(highligtedStar, for: .highlighted)
        button.setImage(highligtedStar, for: [.highlighted, .selected])
    // Adding constraints
    button.translatesAutoresizingMaskIntoConstraints = false // disables buttons automatically generated constraints
    button.heightAnchor.constraint(equalToConstant: starSize.height).isActive = true // defines height
    button.widthAnchor.constraint(equalToConstant: starSize.width).isActive = true // defines width
    //Setup the button action
    button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)
    // Add button to stack
    addArrangedSubview(button)
    // Add the new button to the rating button Array
    ratingButtons.append(button)
    }
    updateButtonSelectionStates()
}
// MARK: Button Action
@objc func ratingButtonTapped(button:UIButton){
    guard let index = ratingButtons.index(of: button) else {
        fatalError("The button, (button), is not in the ratingButtons array: (ratingButtons)")
    }
    // Calculate the rating of the selected button
    let selectedRating = index + 1
    if selectedRating == rating { // If the selected star represents the current rating, reset the rating to 0
        rating = 0
    } else{
        // Otherwise set the rating to the selected star
        rating = selectedRating
    }
}
private func updateButtonSelectionStates() { // Update buttons appearance
    for (index, button) in ratingButtons.enumerated() {
        // If the index of a button is less than the rating, that button should be selected
        button.isSelected = index < rating
    }
}
}
ios swift uitableview
ios swift uitableview
edited Nov 25 '18 at 16:00
asked Nov 22 '18 at 23:07
Kann
64
64
add a comment |
add a comment |
                                1 Answer
                            1
                        
active
oldest
votes
You've got this wrong. Your table view does not save data, it displays it. You want to have a data model that holds the values you display from your table view. That's what feeds your tableView dataSource methods. Often it will be an array of structs.
You want to print the contents of your table view's data model.
Edit:
Now that you've provided that info we can help you.
Add CustomStringConvertible conformance to your data model:
class Match: NSObject, NSCoding, CustomStringConvertible  {
The only requirement for CustomStringConvertible is that you provide a computed property description that's a String:
var description: String {
   return "Match(name:(name),rating:(rating))"
}
Then in your button action
@IBAction func logInfo(sender: UIButton) {
    matching.forEach { print($0) }
}
Since your Match class now conforms to CustomStringConvertible, you can print Match objects directly.
Or if you want indexes:
@IBAction func logInfo(sender: UIButton) {
    matching.enumerated()forEach { print(String(format:"%02l", $0.0) + ": " + $0.1) }
}
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps yourtableview(_:cellForRowAt:)method.
– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
|
show 5 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438927%2fprinting-contents-of-tableview-in-swift-ios-application%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
                                1 Answer
                            1
                        
active
oldest
votes
                                1 Answer
                            1
                        
active
oldest
votes
active
oldest
votes
active
oldest
votes
You've got this wrong. Your table view does not save data, it displays it. You want to have a data model that holds the values you display from your table view. That's what feeds your tableView dataSource methods. Often it will be an array of structs.
You want to print the contents of your table view's data model.
Edit:
Now that you've provided that info we can help you.
Add CustomStringConvertible conformance to your data model:
class Match: NSObject, NSCoding, CustomStringConvertible  {
The only requirement for CustomStringConvertible is that you provide a computed property description that's a String:
var description: String {
   return "Match(name:(name),rating:(rating))"
}
Then in your button action
@IBAction func logInfo(sender: UIButton) {
    matching.forEach { print($0) }
}
Since your Match class now conforms to CustomStringConvertible, you can print Match objects directly.
Or if you want indexes:
@IBAction func logInfo(sender: UIButton) {
    matching.enumerated()forEach { print(String(format:"%02l", $0.0) + ": " + $0.1) }
}
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps yourtableview(_:cellForRowAt:)method.
– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
|
show 5 more comments
You've got this wrong. Your table view does not save data, it displays it. You want to have a data model that holds the values you display from your table view. That's what feeds your tableView dataSource methods. Often it will be an array of structs.
You want to print the contents of your table view's data model.
Edit:
Now that you've provided that info we can help you.
Add CustomStringConvertible conformance to your data model:
class Match: NSObject, NSCoding, CustomStringConvertible  {
The only requirement for CustomStringConvertible is that you provide a computed property description that's a String:
var description: String {
   return "Match(name:(name),rating:(rating))"
}
Then in your button action
@IBAction func logInfo(sender: UIButton) {
    matching.forEach { print($0) }
}
Since your Match class now conforms to CustomStringConvertible, you can print Match objects directly.
Or if you want indexes:
@IBAction func logInfo(sender: UIButton) {
    matching.enumerated()forEach { print(String(format:"%02l", $0.0) + ": " + $0.1) }
}
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps yourtableview(_:cellForRowAt:)method.
– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
|
show 5 more comments
You've got this wrong. Your table view does not save data, it displays it. You want to have a data model that holds the values you display from your table view. That's what feeds your tableView dataSource methods. Often it will be an array of structs.
You want to print the contents of your table view's data model.
Edit:
Now that you've provided that info we can help you.
Add CustomStringConvertible conformance to your data model:
class Match: NSObject, NSCoding, CustomStringConvertible  {
The only requirement for CustomStringConvertible is that you provide a computed property description that's a String:
var description: String {
   return "Match(name:(name),rating:(rating))"
}
Then in your button action
@IBAction func logInfo(sender: UIButton) {
    matching.forEach { print($0) }
}
Since your Match class now conforms to CustomStringConvertible, you can print Match objects directly.
Or if you want indexes:
@IBAction func logInfo(sender: UIButton) {
    matching.enumerated()forEach { print(String(format:"%02l", $0.0) + ": " + $0.1) }
}
You've got this wrong. Your table view does not save data, it displays it. You want to have a data model that holds the values you display from your table view. That's what feeds your tableView dataSource methods. Often it will be an array of structs.
You want to print the contents of your table view's data model.
Edit:
Now that you've provided that info we can help you.
Add CustomStringConvertible conformance to your data model:
class Match: NSObject, NSCoding, CustomStringConvertible  {
The only requirement for CustomStringConvertible is that you provide a computed property description that's a String:
var description: String {
   return "Match(name:(name),rating:(rating))"
}
Then in your button action
@IBAction func logInfo(sender: UIButton) {
    matching.forEach { print($0) }
}
Since your Match class now conforms to CustomStringConvertible, you can print Match objects directly.
Or if you want indexes:
@IBAction func logInfo(sender: UIButton) {
    matching.enumerated()forEach { print(String(format:"%02l", $0.0) + ": " + $0.1) }
}
edited Nov 24 '18 at 12:35
answered Nov 23 '18 at 0:45
Duncan C
92.1k13114196
92.1k13114196
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps yourtableview(_:cellForRowAt:)method.
– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
|
show 5 more comments
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps yourtableview(_:cellForRowAt:)method.
– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
I am asking how to do that. You're just restating what I asked.
– Kann
Nov 23 '18 at 21:26
In order to help you with that you will need to edit your question and add your data model object, and perhaps your
tableview(_:cellForRowAt:) method.– Duncan C
Nov 23 '18 at 22:14
In order to help you with that you will need to edit your question and add your data model object, and perhaps your
tableview(_:cellForRowAt:) method.– Duncan C
Nov 23 '18 at 22:14
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
I have updated the question with the requested information.
– Kann
Nov 24 '18 at 3:50
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
See the edit to my answer.
– Duncan C
Nov 24 '18 at 12:36
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
Okay, this prints them out but it always says the rating is 5 even if a different amount of stars is selected.
– Kann
Nov 24 '18 at 21:54
|
show 5 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
 
But avoid …
- Asking for help, clarification, or responding to other answers.
 - Making statements based on opinion; back them up with references or personal experience.
 
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
 
But avoid …
- Asking for help, clarification, or responding to other answers.
 - Making statements based on opinion; back them up with references or personal experience.
 
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438927%2fprinting-contents-of-tableview-in-swift-ios-application%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown