如何从以编程方式创建的 UITableView 继续?
How do I segue from a programmatically created UITableView?
我正在开发一个具有从左侧滑入的菜单的应用程序。使用 UITableView and an NSObject 以编程方式构建的菜单。我已经能够使用项目填充滑出菜单,但我不知道如何在不使用 Interface Builder 的情况下创建带有标识符的 segue。
这是我要在 tableView 中执行的操作:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cellForRow = tableView.cellForRowAtIndexPath(indexPath)
let cellLabel = cellForRow?.textLabel?.text
delegate?.sideBarControlDidSelectRow(indexPath, cellName: cellLabel!)
if (cellLabel == "Item1") {
self.performSegueWithIdentifier("item1Settings", sender: nil)
} else {
self.performSegueWithIdentifier("item2Settings", sender: nil)
}
}
(要点:SideBarTableViewController)
当我单击菜单中的单元格时出现以下错误:
2015-06-11 18:35:28.720 SideBarApp[2862:1111870] * Terminating app
due to uncaught exception 'NSInvalidArgumentException', reason:
'Receiver () has no
segue with identifier 'item1Settings''
* First throw call stack: (0x1822882d8 0x193aac0e4 0x186fe4c00 0x10000b030 0x10000b108 0x186df1474 0x186eab790 0x186d4c240
0x186cbc6ec 0x1822402a4 0x18223d230 0x18223d610 0x1821692d4
0x18b97f6fc 0x186d2efac 0x1000147cc 0x19412aa08) libc++abi.dylib:
terminating with uncaught exception of type NSException
搜索堆栈后,我在 Objective-C 中找到了一些解决方案,但在这种情况下 Swift 没有找到任何解决方案。
如何从以编程方式创建的 UITableView 继续?
这是我以编程方式 assemble UITableView 的位置:
SideBar.swift View Entire File
func setupSideBar(){
sideBarContainerView.frame = CGRectMake(-barWidth - 1, originView.frame.origin.y, barWidth, originView.frame.size.height)
sideBarContainerView.backgroundColor = UIColor.clearColor()
sideBarContainerView.clipsToBounds = false
originView.addSubview(sideBarContainerView)
let blurView:UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
blurView.frame = sideBarContainerView.bounds
sideBarContainerView.addSubview(blurView)
sideBarTableViewController.delegate = self
sideBarTableViewController.tableView.frame = sideBarContainerView.bounds
sideBarTableViewController.tableView.clipsToBounds = false
sideBarTableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
sideBarTableViewController.tableView.backgroundColor = UIColor.clearColor()
sideBarTableViewController.tableView.scrollsToTop = false
sideBarTableViewController.tableView.contentInset = UIEdgeInsetsMake(sideBarTableViewTopInset, 0, 0, 0)
sideBarTableViewController.tableView.reloadData()
sideBarContainerView.addSubview(sideBarTableViewController.tableView)
}
这里是我的称呼:
ViewController.swift(初始视图)
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = UIImage(named: "image2")
sideBar = SideBar(sourceView: self.view, menuItems: ["first item", "second item", "funny item", "another item"])
sideBar.delegate = self
}
你有标识符为 item1Settings
的 segue 吗?要检查 select 您的 segue 并检查标识符设置为 item1Settings
。 swift 似乎没有在您的情节提要中找到此名称设置。
您尝试做的似乎是在您 select 一个单元格时打开一个设置页面。为此,您需要定义一个新的 UIViewController 来保存设置页面代码。同时创建一个 UIStoryboardSegue 来连接当前的 UIViewController 和你的新 SettingsViewController。
然后,使用 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
,您可以在打开之前获取 SettingsViewController,在其上设置您需要的任何属性,并让它使用这些新数据完成启动。您可能传递的一些数据可能包含告诉 SettingsViewController 哪个单元格被 selected,以及它应该为用户提供什么界面的信息。
如果这不适合您,您可以实例化 SettingsViewController,在其上设置属性,准备就绪后,调用 currentController.presentViewController(settingsController, animated: blah, completion: blah)
我想通了...我需要从我的 viewController 而不是我的 SideBar TableViewController 执行 segue:
class ViewController: UIViewController, SideBarDelegate {
override func viewDidLoad() {
super.viewDidLoad()
sideBar = SideBar(sourceView: self.view, menuItems: ["Item1", "item2"])
sideBar.delegate = self
}
func sideBarDidSelectButtonAtIndex(index: Int) {
if (index == 0) {
self.performSegueWithIdentifier("item1", sender: self)
} else {
self.performSegueWithIdentifier("item2", sender: self)
}
}
我正在开发一个具有从左侧滑入的菜单的应用程序。使用 UITableView and an NSObject 以编程方式构建的菜单。我已经能够使用项目填充滑出菜单,但我不知道如何在不使用 Interface Builder 的情况下创建带有标识符的 segue。
这是我要在 tableView 中执行的操作:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cellForRow = tableView.cellForRowAtIndexPath(indexPath)
let cellLabel = cellForRow?.textLabel?.text
delegate?.sideBarControlDidSelectRow(indexPath, cellName: cellLabel!)
if (cellLabel == "Item1") {
self.performSegueWithIdentifier("item1Settings", sender: nil)
} else {
self.performSegueWithIdentifier("item2Settings", sender: nil)
}
}
(要点:SideBarTableViewController)
当我单击菜单中的单元格时出现以下错误:
2015-06-11 18:35:28.720 SideBarApp[2862:1111870] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver () has no segue with identifier 'item1Settings'' * First throw call stack: (0x1822882d8 0x193aac0e4 0x186fe4c00 0x10000b030 0x10000b108 0x186df1474 0x186eab790 0x186d4c240 0x186cbc6ec 0x1822402a4 0x18223d230 0x18223d610 0x1821692d4 0x18b97f6fc 0x186d2efac 0x1000147cc 0x19412aa08) libc++abi.dylib: terminating with uncaught exception of type NSException
搜索堆栈后,我在 Objective-C 中找到了一些解决方案,但在这种情况下 Swift 没有找到任何解决方案。
如何从以编程方式创建的 UITableView 继续?
这是我以编程方式 assemble UITableView 的位置:
SideBar.swift View Entire File
func setupSideBar(){
sideBarContainerView.frame = CGRectMake(-barWidth - 1, originView.frame.origin.y, barWidth, originView.frame.size.height)
sideBarContainerView.backgroundColor = UIColor.clearColor()
sideBarContainerView.clipsToBounds = false
originView.addSubview(sideBarContainerView)
let blurView:UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.Light))
blurView.frame = sideBarContainerView.bounds
sideBarContainerView.addSubview(blurView)
sideBarTableViewController.delegate = self
sideBarTableViewController.tableView.frame = sideBarContainerView.bounds
sideBarTableViewController.tableView.clipsToBounds = false
sideBarTableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
sideBarTableViewController.tableView.backgroundColor = UIColor.clearColor()
sideBarTableViewController.tableView.scrollsToTop = false
sideBarTableViewController.tableView.contentInset = UIEdgeInsetsMake(sideBarTableViewTopInset, 0, 0, 0)
sideBarTableViewController.tableView.reloadData()
sideBarContainerView.addSubview(sideBarTableViewController.tableView)
}
这里是我的称呼:
ViewController.swift(初始视图)
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = UIImage(named: "image2")
sideBar = SideBar(sourceView: self.view, menuItems: ["first item", "second item", "funny item", "another item"])
sideBar.delegate = self
}
你有标识符为 item1Settings
的 segue 吗?要检查 select 您的 segue 并检查标识符设置为 item1Settings
。 swift 似乎没有在您的情节提要中找到此名称设置。
您尝试做的似乎是在您 select 一个单元格时打开一个设置页面。为此,您需要定义一个新的 UIViewController 来保存设置页面代码。同时创建一个 UIStoryboardSegue 来连接当前的 UIViewController 和你的新 SettingsViewController。
然后,使用 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
,您可以在打开之前获取 SettingsViewController,在其上设置您需要的任何属性,并让它使用这些新数据完成启动。您可能传递的一些数据可能包含告诉 SettingsViewController 哪个单元格被 selected,以及它应该为用户提供什么界面的信息。
如果这不适合您,您可以实例化 SettingsViewController,在其上设置属性,准备就绪后,调用 currentController.presentViewController(settingsController, animated: blah, completion: blah)
我想通了...我需要从我的 viewController 而不是我的 SideBar TableViewController 执行 segue:
class ViewController: UIViewController, SideBarDelegate {
override func viewDidLoad() {
super.viewDidLoad()
sideBar = SideBar(sourceView: self.view, menuItems: ["Item1", "item2"])
sideBar.delegate = self
}
func sideBarDidSelectButtonAtIndex(index: Int) {
if (index == 0) {
self.performSegueWithIdentifier("item1", sender: self)
} else {
self.performSegueWithIdentifier("item2", sender: self)
}
}