У меня есть подкласс 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
}
Что может быть лучшим способом сделать все это?