gpt4 book ai didi

ios - 带有与 ViewController 分离的 Controller 的 UITableView

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:06 25 4
gpt4 key购买 nike

我是 Swift 和 XCode 的新手,今年夏天参加了 iOS 开发类(class)。我们正在做的许多项目和我看到的关于 UI 元素(如 PickerViews、TableViews 等)的许多项目都在 ViewController.swift 文件中定义了充当主视图 Controller 的所有内容。这工作正常,但我开始达到项目复杂性的地步,我真的希望我的所有代码都不会塞进同一个 Swift 文件中。我和一个兼职做 iOS 开发的 friend 谈过,他说这是理智和合理的,并且很好地符合适当的面向对象编程......但我似乎无法让它工作。通过反复试验,我遇到了这种情况:应用程序在模拟器中运行,出现了 UITableView,但我没有用条目填充它。当所有代码都在 ViewController 中时,我可以让它正常工作,但是一旦我开始尝试创建一个新的 Controller 类并将该类的实例作为 UITableView 的数据源/委托(delegate),我就开始一无所获。我觉得我要么在这里缺少对 Swift 的一些核心理解,要么在 XCode 中对 Interface Builder 做错了什么。

我的最终结果应该是一个包含三个条目的 UITableView;目前我得到一个没有条目的 UITableView。我正在关注我用 Google 搜索过的几个不同示例,但主要是另一个 SO 问题:UITableView example for Swift

ViewController.swift:

import UIKit

class ViewController: UIViewController{

@IBOutlet var stateTableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()
var viewController = StateViewController()
self.stateTableView.delegate = viewController
self.stateTableView.dataSource = viewController
}
}

StateViewController.swift:

import UIKit

class StateViewController: UITableViewController{
var states = ["Indiana", "Illinois", "Nebraska"]

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return states.count;
}

func tableView(cellForRowAttableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style:UITableViewCellStyle.default, reuseIdentifier:"cell")
cell.textLabel?.text = states[indexPath.row]
return cell
}
}

在 XCode 中,我将 UITableView 连接到 View Controller ; socket 设置为 dataSourcedelegate,引用 socket 为 stateTableView

我没有收到任何错误;我确实在 ViewController.swift 中的“var viewController = StateViewController()”语句中收到警告,它希望我使用常量,但将其切换为常量不会改变行为(这是应该的,我假设)。

最初我假设错误出在我的 StateViewController.swift 文件中,我没有在其中创建遵守 UITableViewDataSource 或 UITableViewDelegate 协议(protocol)的对象,但如果我什至将它们添加到类语句中,我会立即收到类似“'StateViewController' 与协议(protocol) 'UITableViewDataSource' 的冗余一致性”- 我读到这是因为从 UITableViewController 继承也会自动继承其他协议(protocol)。

我尝试的最后一件事是在 StateViewController 的 tableView 函数中引用 self.states,但我很确定 self 在 Swift 中的工作方式与在 Python 中一样,感觉就像我'只是想在这一点上添加魔术词。

我已经就我目前有限的 Swift 知识进行了调查,所以任何能解释什么我做错了而不是仅仅告诉我要修复什么的答案都将不胜感激.

最佳答案

您的问题是由内存管理问题引起的。您有以下代码:

override func viewDidLoad() {
super.viewDidLoad()
var viewController = StateViewController()
self.stateTableView.delegate = viewController
self.stateTableView.dataSource = viewController
}

想想 viewController 的生命周期多变的。当viewDidLoad结束时结束到达了。由于 TableView 的 dataSourcedelegate属性是 weak , 没有强引用来保留你的 StateViewController活过一次viewDidLoad结束。由于弱引用,结果是 dataSourcedelegate TableView 的属性恢复为 nil viewDidLoad结束后达到了。

解决方案是为您的 StateViewController 创建一个强引用.通过向您的 View Controller 类添加一个属性来做到这一点:

class ViewController: UIViewController{
@IBOutlet var stateTableView: UITableView!
let viewController = StateViewController()

override func viewDidLoad() {
super.viewDidLoad()

self.stateTableView.delegate = viewController
self.stateTableView.dataSource = viewController
}
}

现在您的代码可以工作了。

一旦你开始工作,查看 Ahmed F 的答案。绝对没有理由为什么你的 StateViewController类应该是一个 View Controller 。它在任何意义上都不是 View Controller 。它只是一个实现 TableView 数据源和委托(delegate)方法的类。

关于ios - 带有与 ViewController 分离的 Controller 的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44771184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com