0

我正在开发一个具有从左侧滑入的菜单的应用程序。使用UITableViewNSObject以编程方式构建的菜单。我已经能够用项目填充滑出菜单,但我不知道如何在不使用 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”的segue”*第一次抛出调用堆栈:(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 中分离?


这是我以编程方式组装 UITableView 的地方:

SideBar.swift 查看整个文件

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

    }
4

3 回答 3

2

您尝试做的是在选择单元格时打开设置页面。为此,您需要定义一个新的 UIViewController 来保存设置页面代码。同时创建一个 UIStoryboardSegue 来连接当前的 UIViewController 和你的新的 SettingsViewController。

然后,使用override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)您可以在打开之前获取 SettingsViewController,在其上设置您需要的任何属性,并让它完成启动并使用这些新数据供其使用。您可能传递的一些数据可能包含告诉 SettingsViewController 选择了哪个单元格以及它应该为用户提供什么界面的信息。

如果这不适合您,您可以实例化 SettingsViewController,在其上设置属性,当您准备好时,调用currentController.presentViewController(settingsController, animated: blah, completion: blah)

于 2015-06-12T00:32:27.593 回答
1

你有标识符的segueitem1Settings吗?要检查,请选择您的 segue 并检查标识符设置为item1Settings. 似乎 swift 在您的故事板中没有找到此名称设置。

在此处输入图像描述

于 2015-06-12T00:24:00.907 回答
0

我想通了......我需要从我的 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)
        }

    }
于 2015-06-12T00:49:27.803 回答