如何从以编程方式创建的 UITableView 中分离?
Posted
技术标签:
【中文标题】如何从以编程方式创建的 UITableView 中分离?【英文标题】:How do I segue from a programmatically created UITableView? 【发布时间】:2015-06-12 00:03:34 【问题描述】:我正在开发一个具有从左侧滑入的菜单的应用程序。使用UITableView 和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] * 终止应用 由于未捕获的异常“NSInvalidArgumentException”,原因: '接收者()没有 使用标识符“item1Settings”进行转义 * 第一次抛出调用栈:(0x1822882d8 0x193aac0e4 0x186fe4c00 0x10000b030 0x10000b108 0x186df1474 0x186eab790 0x186d4c240 0x186cbc6ec 0x1822402a4 0x18223d230 0x18223d610 0x1821692d4 0x18b97f6fc 0x186d2efac 0x1000147cc 0x19412aa08) libc++abi.dylib: 以 NSException 类型的未捕获异常终止
在搜索堆栈后,我在 Objective-C 中找到了一些解决方案,但在这种情况下没有 Swift 的解决方案。
这是我以编程方式组装 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
【问题讨论】:
viewController之间使用了segue?你的意思是你的settings1
或者settings2
viewController是代码创建的?
这让我有点困惑,我对 swift 还很陌生。但是边栏是在初始 viewDidLoad 中调用的。这会以编程方式创建 UITableView。 TableViewController 没有情节提要实体
【参考方案1】:
看起来您正在尝试做的是在您选择一个单元格时打开一个设置页面。为此,您需要定义一个新的 UIViewController 来保存设置页面代码。同时创建一个 UIStoryboardSegue 来连接当前的 UIViewController 和你的新 SettingsViewController。
然后,使用override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
,您可以在打开之前获取 SettingsViewController,在其上设置您需要的任何属性,然后让它完成启动并使用这些新数据。您可能传递的一些数据可能包含告诉 SettingsViewController 选择了哪个单元格以及它应该为此向用户提供什么界面的信息。
如果这不适合您,您可以实例化 SettingsViewController,在其上设置属性,当您准备好时,调用 currentController.presentViewController(settingsController, animated: blah, completion: blah)
【讨论】:
'UIStoryboardSegue 连接当前的 UIViewController 和你的新 SettingsViewController。'我已经试过了,但我现在再试一次。编辑:实际上我的发件人之前被设置为零。 请务必将sender
设置为self
。
没用...遇到我在我的 OP 中列出的相同错误
更好的方法是实例化 SettingsViewController,设置您可能需要的任何属性,然后调用 currentController.presentViewController(settingsController, animated: blah, completion: blah)
刚刚将其标记到末尾。让我知道结果如何!【参考方案2】:
您有标识符为item1Settings
的segue 吗?检查选择你的segue并检查标识符设置为item1Settings
。 swift 似乎没有在您的故事板中找到此名称设置。
【讨论】:
这是我的观点,表格视图是以编程方式创建的。因此,您在照片中显示的实体直到运行时才存在 你在哪里创建它?在这种情况下,您不应该使用 performSegueWithIdentifier,只需在创建后推送表视图 我已经包含了两个 github-gist 文件,它们显示了创建表视图的位置。 对不起,我看不到您在哪里创建 UITableViewController,也许您需要多解释一下什么视图推送什么视图等。但基本上您应该创建表格视图并推送它。 你的 sideView 不是控制器,所以你不能推送它,你可以将它的视图添加到你已经拥有的控制器的视图中,你可以从 UIViewController 或 UITableViewController 继承作为推送新的控制器在旧控制器之上。【参考方案3】:我想通了...我需要从我的 viewController 而不是我的 SideBarTableViewController 执行 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 中分离?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?
无法从以编程方式创建的 UINavigationController 推送