在 Swift 中以编程方式创建 UITableViewController
Posted
技术标签:
【中文标题】在 Swift 中以编程方式创建 UITableViewController【英文标题】:create a UITableViewController programmatically in Swift 【发布时间】:2014-06-07 15:34:05 【问题描述】:正如标题所说,我正在尝试以编程方式设置 UITableViewController。经过几个小时的尝试,我希望有人可以帮助我。而且,是的,我已经查看了有关此问题的其他帖子:
import UIKit
class MainViewController: UITableViewController
init(style: UITableViewStyle)
super.init(style: style)
// Custom initialization
override func viewDidLoad()
super.viewDidLoad()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
// #pragma mark - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView?) -> Int
return 1
override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int
return 5
override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell?
var cell = tableView?.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell
if !cell
cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
cell!.textLabel.text = "test"
return cell
appDelegate 看起来像这样:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainViewController: UITableViewController = MainViewController(style: UITableViewStyle.Plain)
let navigationController: UINavigationController = UINavigationController()
navigationController.pushViewController(mainViewController, animated: false)
self.window!.rootViewController = navigationController
self.window!.backgroundColor = UIColor.whiteColor()
self.window!.makeKeyAndVisible()
return true
程序运行,但一旦运行,我收到以下错误:
fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'HelloWorld.MainViewController'
然后我将MainViewController(style: UITableViewStyle.Plain)
更改为MainViewController(nibName: nil, bundle: nil)
,但随后出现以下语法错误:Extra argument 'bundle' in call
任何帮助将不胜感激
【问题讨论】:
你是如何定义 MainViewController 类的? MainViewController 的定义是什么?你是直接从 UITableViewController 继承的吗?你定义了初始化器吗? @Lukas 我更新了代码 【参考方案1】:我正在使用 UITableViewController 的子类,没有问题,使用 (nibName:bundle:) 表单,但我已经在我的子类中覆盖了它。我尝试用标准的 UITableViewController 替换我的子类,它仍然可以正常工作。您是否可能在您的子类中重写了 init(...) 方法?
【讨论】:
当我删除 MainViewController 中的 init 函数时,程序运行得很好。我刚刚在 SO 上遇到了同样问题的帖子(不知道在发布之前我怎么没看到那个帖子..)。但为什么有必要这样做呢? 确保您从自己的初始化程序中调用了适当的继承 init(...) 方法。 当您添加指定的初始化程序时,Swift 会使派生类的客户端无法访问继承的初始化程序。它看起来类似于 C++ 中的私有继承,其中继承的方法/数据被隐式移动到“私有”类部分。原因很简单:如果有一个自定义初始化器,那么您的类可能需要这个初始化器来构造类“不变”。但是有一个错误:如果您创建从 UITableViewController 派生的类并添加调用 super.init(style:) 的自定义初始化程序,它将失败,使用未实现的初始化程序 'init(nibName:bundle:)' 【参考方案2】:在 AppDelegate 或任何你调用 TableViewController 的地方:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool
window = UIWindow(frame: UIScreen.mainScreen().bounds)
if let window = window
window.backgroundColor = UIColor.whiteColor()
var mainTableViewController = MainTableTableViewController(style: .Plain)
window.rootViewController = UINavigationController(rootViewController: mainTableViewController)
window.makeKeyAndVisible()
return true
在 UITableViewController 中(假设没有自定义 TableViewCell 实现):
import UIKit
class MainTableTableViewController: UITableViewController
override init(style: UITableViewStyle)
super.init(style: style)
override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
required init(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
override func viewDidLoad()
super.viewDidLoad()
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
// MARK: - Tableview Data Source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return [*YOUR_DATA_ARRAY].count
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel!.text = [*YOUR_DATA_ARRAY][indexPath.row]
完整示例:访问:https://github.com/ericcgu/EGStormTracker
【讨论】:
【参考方案3】:我只是删除
init(style: UITableViewStyle)
super.init(style: style)
然后像这样初始化:
let mainViewController: UITableViewController = MainViewController()
【讨论】:
以上是关于在 Swift 中以编程方式创建 UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中以编程方式创建 SplitViewController?
在 Swift 中以编程方式创建垂直 UIScrollView
使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?
如何在 ios swift 中以编程方式创建自动布局等宽约束?