Лучший способ установить значение свойства, которое в настоящее время доступно только для получения - PullRequest
0 голосов
/ 09 июля 2019

У меня есть подкласс UITableViewCell с именем ConferenceResultsTableViewCell.Вот его код:

import Foundation
import UIKit
import os.log

class ConferenceResultsTableViewCell: UITableViewCell {

    public var game: Game {

        get {
            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
                fatalError("Could not get appDelagate in ConferenceResultsTableViewCell.swift")
            }
            let managedContext = appDelegate.persistentContainer.viewContext

            var contestantsStrArray = [String]()
            guard let contestant1 = gameWinnerControl.titleForSegment(at: 0) else {
                os_log("Could not unwrap contestant1 in ConferenceResultsTableViewCell.swift", log: OSLog.default, type: .debug)
                return Game.newGame(context: managedContext, contestants: nil, winner: nil, confidence: nil, conferences: nil)
            }
            guard let contestant2 = gameWinnerControl.titleForSegment(at: 1) else {
                os_log("Could not unwrap contestant2 in ConferenceResultsTableViewCell.swift", log: OSLog.default, type: .debug)
                return Game.newGame(context: managedContext, contestants: nil, winner: nil, confidence: nil, conferences: nil)
            }
            contestantsStrArray.append(contestant1)
            contestantsStrArray.append(contestant2)
            let winnerStr = contestantsStrArray[gameWinnerControl.selectedSegmentIndex]
            guard let confidenceStr = confidenceTextField.text else {
                os_log("Could not unwrap confidenceStr in ConferenceResultsTableViewCell.swift", log: OSLog.default, type: .debug)
                return Game.newGame(context: managedContext, contestants: contestantsStrArray, winner: winnerStr, confidence: nil, conferences: nil)
            }
            return Game.newGame(context: managedContext, contestants: contestantsStrArray, winner: winnerStr, confidence: Int(confidenceStr), conferences: nil)
        }

    }

    @IBOutlet weak var gameWinnerControl: UISegmentedControl!
    @IBOutlet weak var confidenceTextField: UITextField!
    @IBOutlet weak var confidenceAverageAllUsersLabel: UILabel!

}

Эта ячейка должна иметь свойство с именем game, которое содержит некоторую информацию, которая будет отображаться.Это Game.swift:

import Foundation
import CoreData

class Game: NSManagedObject {

    @NSManaged var contestants: [String]
    @NSManaged var winner: String
    @NSManaged var confidence: Int
    @NSManaged var conferences: [String]

}

extension Game {

    public static func newGame(context: NSManagedObjectContext, contestants: [String]?, winner: String?, confidence: Int?, conferences: [Conference]?) -> Game {

        let newGame = Game(context: context)

        if let contestants = contestants {
            newGame.contestants = contestants
        } else {
            newGame.contestants = ["", ""]
        }
        if let winner = winner {
            newGame.winner = winner
        } else {
            newGame.winner = ""
        }
        if let confidence = confidence {
            newGame.confidence = confidence
        } else {
            newGame.confidence = 0
        }
        if let conferences = conferences {
            newGame.conferences.removeAll()
            for conference in conferences {
                newGame.conferences.append(Conference.getStringValue(conference: conference))
            }
//            newGame.conferences = conferences.map({ Conference.getStringValue(conference: $0) })
        } else {
            newGame.conferences.removeAll()
            newGame.conferences.append("CAA")
        }

        return newGame

    }

}

Моя проблема в том, что эта game переменная в настоящее время доступна только для получения, поэтому я не могу установить значение игры из ConferenceResultsTableViewController.tableView(cellForRowAt:).Вот код для этого метода, который пытается установить значение ячейки для переменной game:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        guard let cell = tableView.dequeueReusableCell(withIdentifier: CONFERENCE_RESULTS_CELL_IDENTIFIER, for: indexPath) as? ConferenceResultsTableViewCell else {
            fatalError("The dequeued cell is not an instance of ConferenceResultsTableViewCell.")
        }
        guard let game = self.gamesToBeShown[safe: indexPath.row] else {
            os_log("Could not unwrap game for indexPath in ConferenceResultsTableViewController.swift", log: OSLog.default, type: .default)
            self.tableView.reloadData()
            return ConferencesTableViewCell()
        }

        cell.game = game
        cell.gameWinnerControl.insertSegment(withTitle: game.contestants[0], at: 0, animated: true)
        cell.gameWinnerControl.insertSegment(withTitle: game.contestants[1], at: 1, animated: true)
        cell.confidenceTextField.text = String(game.confidence)
        cell.confidenceAverageAllUsersLabel.text = "0"

        return cell

    }

Я получаю Thread 1: EXC_BAD_ACCESS при использовании следующего в качестве метода установки в подклассе UITableViewCell:

set {
    self.game = newValue
}

Что может быть лучшим способом сделать все это?

1 Ответ

0 голосов
/ 10 июля 2019

Я решил просто удалить переменную game из моего класса и обойтись без нее. По какой-то причине я думал, что мне это нужно, но я понял, что мне это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...