- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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 设置为 dataSource
和 delegate
,引用 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 的 dataSource
和 delegate
属性是 weak
, 没有强引用来保留你的 StateViewController
活过一次viewDidLoad
结束。由于弱引用,结果是 dataSource
和 delegate
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/
我现在在另一个 ViewController 之上展示了一个几乎透明的 ViewController,但它禁用了与下面的 ViewController 的交互。这是我目前使用的代码: topContr
我有一个 View Controller ,其工具栏上有 3 个 UIButtons,可以打开一个新的 View Controller 作为弹出窗口。我在 Storyboard 中创建了 Segues
这个问题在这里已经有了答案: Delegates in swift? (15 个答案) 关闭 3 年前。 在我的场景中,我试图在关闭 View Controller 期间将值从 ViewContro
假设我有两个 viewController,AViewController 和 BViewController。 AViewController 嵌入在 NavigationController 中(
我有 3 个 View Controller A、B 和 C。 我在 vcA 上,我使用 推送 vcB [self.navigationController pushViewController:vc
我想知道如何在 VC3 和 VC1 之间传递数据。 我拥有的是 Root View (VC1)。然后你输入一个tableView,如果你选择一个项目,你将进入tableView2(VC3) - 类别
我在使用 Unwind Segue 时遇到问题。我有 3 个 ViewController,它们都在名为 ViewController.swift 的类下。我试图获取最后一个 ViewControll
我有一个应用程序,其左上角有一个汉堡菜单。按下时,菜单会以 90% 的不透明度淡入当前 ViewController,显示应用程序的主要导航选项。 我使用下面的代码从页面呈现 viewControll
我的问题是,当我呈现一个 UIViewController 时,呈现的 View 变黑了。 我有一个名为 mainViewController 的 UIViewController,它是我窗口的 Ro
例如,当我呈现UIActivityViewController或UIAlertController时,我仍然可以看到背景viewController,我不想在viewContollerA中嵌入view
我从second viewController进入了third viewController,但是我不想回到第二个viewController,我需要直接回到我的第一个viewController,我
我的应用程序是标签栏(+ 导航)应用程序。在 FirstViewController 中,我调用 onModalView。 -(void) onFilter { FilterViewControl
Photo Sharing 部分是我写的一个ViewController,当我按下正确的项目时,PhotoSharingViewController 会动画出现。 这是我的代码: PhotoShari
我正在尝试在另一个 View Controller 中使用 subview Controller 的应用程序。我有一个 VC,我正在实例化另一个 VC,并在外部 VC 内使用它自己的 xib。 我使用
我正在寻找有关包含 ViewController 的滚动的想法。我需要知道包含 View Controller 的位置。我已经尝试过 UIPageViewController 但我无法让滚动委托(de
我有一个带有嵌入式 NavigationController 的基本 ViewController 来提供工具栏。 ToolBar 有三个按钮,用于通过 segue 调用 ViewController
我的应用程序中的伙计们,我在应用程序委托(delegate)方法中有一些代码 application:didFinishLaunchingWithOptions:确定初始 View Controlle
我遇到了一个问题,我将对此进行描述,并且发现了一些类似的问题,但我认为与我的问题无关。 我有一个 UITabBarController,其中有 2 个用于 VC1 和 VC2 的选项卡。 VC1 转到
我的应用程序中有一个计时器。如果计时器达到 0,则用户将被带到失败页面。当这种情况发生时,之前的 ViewController 没有被关闭,导致更多的内存被占用。 如果出现失败页面,我希望关闭之前的
在问这个问题之前,我当然做了一些调查。我在 google 和 stackoverflow 上找到的链接或主题之一是: How do I load another view controller fro
我是一名优秀的程序员,十分优秀!