我對 Swift 編程非常陌生,而且我越來越不喜歡它了。我不像其他語言那樣容易掌握它。
我有一個正在進行的專案,但我無法弄清楚哪里出了問題或為什么它不起作用。
在一個視圖中,我有一個包含單元格的表視圖。我正在使用一個陣列來存盤我想要存盤在表視圖中相應元素中的所有值。
當用戶單擊表格視圖中的單個單元格時,它將把他們帶到另一個顯示電影其他元素(運行時間、影像、導演和年份)的視圖。
我有一個用于撰寫此代碼的模板,我認為我已正確完成所有操作,但是當我運行該應用程式時,沒有任何顯示。
當我運行應用程式時,我只想在啟動時顯示表格單元格。如果我可以顯示表格單元格,我什至可以自行解決問題。
由于我對這種語言和 XCode 還很陌生,因此我無法在 IDE 中導航以查找我的問題。最重要的是,我已經在與 Swift 作斗爭了。
如果可能的話,我真的可以使用幫助!
這是我完成的所有代碼:
import UIKit
class ViewController: UIViewController,
UITableViewDelegate,
UITableViewDataSource {
let movieList = ["Step Brothers", "Pulp Fiction", "Ali", "Harry Potter"]
let yearList = ["2008", "1994", "2001", "2001"]
let images = ["step_brothers", "pulp_fiction", "ali", "harry_potter3"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movieList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tempCell: TableViewCell = tableView.dequeueReusableCell(withIdentifier:
"cell") as! TableViewCell
tempCell.movieTitleLabel.text = movieList[indexPath.row]
tempCell.movieYearLabel.text = yearList[indexPath.row]
tempCell.movieImage.image = UIImage(named: images[indexPath.row] ".jpeg")
return tempCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let detailVC:MovieDetailViewController = self.storyboard?.instantiateViewController(withIdentifier: "MovieDetailViewController") as! MovieDetailViewController
// assign the values to the local variable declared in ProductDetailViewController Class
detailVC.movieImage = UIImage(named: images[indexPath.row] ".jpeg")!
// make it navigate to ProductDetailViewController
self.navigationController?.pushViewController(detailVC, animated: true)
}
}
這是針對表視圖中的單個單元格:
import UIKit
class TableViewCell: UITableViewCell {
@IBOutlet weak var movieTitleLabel: UILabel!
@IBOutlet weak var movieYearLabel: UILabel!
@IBOutlet weak var movieImage: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
這是 MovieDetailViewController:
class MovieDetailViewController: UIViewController {
@IBOutlet weak var movieDetailImage: UIImageView!
@IBOutlet weak var runtimeLabel: UILabel!
@IBOutlet weak var yearDetailLabel: UILabel!
@IBOutlet weak var directorDetailLabel: UILabel!
var runtime: String! // holds the product name
var year: String! // holds the price
var movieImage: UIImage! // holds the product image
var director: String!
override func viewDidLoad() {
super.viewDidLoad()
movieDetailImage.image = movieImage
runtimeLabel.text = runtime
yearDetailLabel.text = year
directorDetailLabel.text = director
// Do any additional setup after loading the view.
}
/*
// 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.destination.
// Pass the selected object to the new view controller.
}
*/
}
這是終端中顯示的錯誤,但代碼中沒有實際錯誤:
2022-11-14 17:39:28.232645-0500 Exercise01[25678:1217794] [Storyboard] Unable to find method -[(null) TableViewCell] 2022-11-14 17:39:28.259975-0500 Exercise01[25678:1217794] [Assert] UINavigationBar decoded as unlocked for UINavigationController, or navigationBar delegate set up incorrectly. Inconsistent configuration may cause problems. navigationController=<UINavigationController: 0x141012400>, navigationBar=<UINavigationBar: 0x142106160; frame = (0 47; 0 50); opaque = NO; autoresize = W; layer = <CALayer: 0x600001d72280>> delegate=0x141012400
如果您需要,我可以加入 AppDelegate 和 SceneDelegate,請告訴我。
再次感謝大家!非常感謝您的幫助!
uj5u.com熱心網友回復:
我首先建議擺脫 Storyboards,它們容易出錯并且除錯很麻煩。
您的問題:我沒有看到您將 UITableView 連接到 ViewController(如果您使用故事板,則使用 IBOutlet)。您需要做的是為該 UITableView 設定 UITableViewDelegate 和 UITableViewDataSource
class ViewController: UIViewController,
UITableViewDelegate,
UITableViewDataSource {
let movieList = ["Step Brothers", "Pulp Fiction", "Ali", "Harry Potter"]
let yearList = ["2008", "1994", "2001", "2001"]
let images = ["step_brothers", "pulp_fiction", "ali", "harry_potter3"]
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
uj5u.com熱心網友回復:
我試過你的代碼,我沒有得到任何錯誤,我希望你已經設定了表視圖的資料源和委托。只需將其添加到您的 viewDidLoad()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
uj5u.com熱心網友回復:
我認為委托和資料源不是唯一的錯誤......這是一個示例(完整代碼),說明如何以編程方式執行此操作:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let movieList = ["Step Brothers", "Pulp Fiction", "Ali", "Harry Potter"]
let yearList = ["2008", "1994", "2001", "2001"]
let images = ["step_brothers", "pulp_fiction", "ali", "harry_potter3"]
let tableView = UITableView() // declare tableView
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
tableView.backgroundColor = .white
tableView.translatesAutoresizingMaskIntoConstraints = false // disable defaults constrints
// set delegate and datasource
tableView.delegate = self
tableView.dataSource = self
tableView.register(TableViewCell.self, forCellReuseIdentifier: "cell") // register your cell
view.addSubview(tableView)
tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movieList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let tempCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell // get cellId and indexPath
tempCell.movieTitleLabel.text = movieList[indexPath.row]
tempCell.movieYearLabel.text = yearList[indexPath.row]
tempCell.movieImage.image = UIImage(named: images[indexPath.row])
return tempCell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 80 // height of single row
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = tableView.cellForRow(at: indexPath) as! TableViewCell // This is your cell in didSelectRow to obtain objects in there
let detailVC = MovieDetailViewController()
detailVC.movieImage = cell.movieImage.image ?? UIImage()
detailVC.runtimeLabel.text = cell.movieTitleLabel.text
detailVC.yearDetailLabel.text = cell.movieYearLabel.text
navigationController?.pushViewController(detailVC, animated: true)
}
}
這是你的手機:
class TableViewCell: UITableViewCell {
let movieTitleLabel = UILabel()
let movieYearLabel = UILabel()
let movieImage = UIImageView()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.backgroundColor = .white
movieTitleLabel.textColor = .black
movieYearLabel.textColor = .black
movieTitleLabel.translatesAutoresizingMaskIntoConstraints = false
movieYearLabel.translatesAutoresizingMaskIntoConstraints = false
movieImage.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(movieImage)
movieImage.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
movieImage.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
movieImage.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
movieImage.widthAnchor.constraint(equalTo: contentView.heightAnchor).isActive = true
let stackView = UIStackView(arrangedSubviews: [movieTitleLabel, movieYearLabel])
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(stackView)
stackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
stackView.leadingAnchor.constraint(equalTo: movieImage.trailingAnchor, constant: 10).isActive = true
stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true
stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
這是你的 movieDetailController:
class MovieDetailViewController: UIViewController {
let movieDetailImage = UIImageView()
let runtimeLabel = UILabel()
let yearDetailLabel = UILabel()
let runtime = String() // holds the product name
var year = String() // holds the price
var movieImage = UIImage() // holds the product image
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
movieDetailImage.translatesAutoresizingMaskIntoConstraints = false
runtimeLabel.translatesAutoresizingMaskIntoConstraints = false
yearDetailLabel.translatesAutoresizingMaskIntoConstraints = false
movieDetailImage.image = movieImage
movieDetailImage.contentMode = .scaleAspectFill
runtimeLabel.textColor = .black
runtimeLabel.textAlignment = .center
yearDetailLabel.textColor = .black
yearDetailLabel.textAlignment = .center
view.addSubview(movieDetailImage)
movieDetailImage.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
movieDetailImage.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
movieDetailImage.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
movieDetailImage.heightAnchor.constraint(equalTo: movieDetailImage.widthAnchor).isActive = true
let stackView = UIStackView(arrangedSubviews: [runtimeLabel, yearDetailLabel])
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
stackView.topAnchor.constraint(equalTo: movieDetailImage.bottomAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: movieDetailImage.leadingAnchor).isActive = true
stackView.heightAnchor.constraint(equalToConstant: 60).isActive = true
stackView.trailingAnchor.constraint(equalTo: movieDetailImage.trailingAnchor).isActive = true
}
}
這就是結果(directorDetailLabel 沒有任何陣列)

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533786.html
標籤:ios迅速苹果手机
上一篇:NSUrl拋出例外
