在Swift中将segue从ViewableViewCell推到ViewController

e4eetjau  于 12个月前  发布在  Swift
关注(0)|答案(9)|浏览(155)

我遇到了与我的CableViewCells有关的问题。我将CableView连接到一个API来填充我的单元格。
然后我创建了一个函数,它捕获indexPath.row,以识别数组中的哪个JSON对象应该发送到RestaurantViewController
链接到我的Xcode项目,以便更轻松地调试和解决问题
下面是我的小片段如何将“行点击”设置为全局变量。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
     i = indexPath.row
}

字符串
这是我的prepareForSegue()函数,它应该把我的push-segue连接到RestaurantViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "toRestaurant"{
    let navigationController = segue.destinationViewController as UINavigationController
    let vc = navigationController.topViewController as RestaurantViewController
    vc.data = currentResponse[i] as NSArray
 }
}


下面是我如何从UITableViewCell x1c 0d1x设置segue的
这是我的结果,我尝试点击每一个单元格,但我不会被推到另一个viewController.我也没有得到一个错误。这里有什么问题吗?



尝试解决方案,但不起作用

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "toRestaurant"{
            let vc = segue.destinationViewController as RestaurantViewController
            //let vc = navigationController.topViewController as RestaurantViewController
            vc.data = currentResponse[i] as NSArray
        }
    }

2guxujil

2guxujil1#

问题是你没有正确处理你的数据。如果你查看你的currentResponse数组,你会看到它保存了NSDictionary,但在你的prepareForSegue中,你试图将NSDictionary转换为NSArray,这将使应用程序崩溃。
RestaurantViewController中的data变量更改为NSDictionary,并将prepareForSegue更改为传递NSDictionary

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let cell = sender as? UITableViewCell {
        let i = redditListTableView.indexPathForCell(cell)!.row
        if segue.identifier == "toRestaurant" {
            let vc = segue.destinationViewController as RestaurantViewController
            vc.data = currentResponse[i] as NSDictionary
        }
    }
}

字符串
对于Swift 5

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if let cell = sender as? UITableViewCell {
            let i = self.tableView.indexPath(for: cell)!.row
            if segue.identifier == "toRestaurant" {
                let vc = segue.destination as! RestaurantViewController
                vc.data = currentResponse[i] as NSDictionary
            }
        }
    }

fhg3lkii

fhg3lkii2#

以下步骤应该可以解决您的问题。如果不能,请让我知道。
1.删除您的tableView(tableView, didSelectRowAtIndexPath:)实现。
1.使RestaurantViewController上的data具有NSDictionary!类型
1.确定prepareForSegue中的选定行:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if let cell = sender as? UITableViewCell {
        let i = tableView.indexPathForCell(cell)!.row
        if segue.identifier == "toRestaurant" {
            let vc = segue.destinationViewController as RestaurantViewController
            vc.data = currentResponse[i] as NSDictionary
        }
    }
}

字符串

5lhxktic

5lhxktic3#

Dropbox link to stack3 directory
1.我很难理解为什么你的软件比标准的2级表视图结构有很大的不同。所以我编写了一个简短的例子,你可以从这个链接访问。我还包括下面的源代码。
1.这个程序模仿了你所拥有的(尽我所能理解它)。表控制器1从tableview单元格转移到表控制器2。我对segue-ing没有问题。注意,我没有也不需要增加故事书来启动segue。
1.我已经把这两个控制器都嵌入到了导航控制器中。我的经验是,设置导航可以节省很多精力。
1.或者,我可以将控件从屏幕顶部的第一个TableViewController符号拖动到第二个控制器,并设置segue。
1.我使用了一个全局变量(selectedRow),尽管这不是推荐的做法。但是,您可以轻松地使用RectreForSegue在RectantTableViewController中设置变量(我展示了一个示例)。
1.最后,我建议检查连接检查器(对于第一个控制器中的表格视图单元格),以确认有一个到第二个控制器的segue。如果你正确地拖动控制,应该会有确认提示,以及连接检查器中的一个条目。
不幸的是,我只是不能得到正确的格式化代码

import UIKit

var selectedRow = -1

class TableViewController: UITableViewController {

var firstArray = ["Item1","Item2","Item3","Item4"]

override func viewDidLoad() {

super.viewDidLoad()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return firstArray.count

}

let nameOfCell = "RestaurantCell"

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier(nameOfCell, forIndexPath: indexPath) as UITableViewCell

cell.textLabel!.text = firstArray[indexPath.row]

return cell

}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

selectedRow = indexPath.row

}

// MARK: - Navigation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

let vc = segue.destinationViewController as RestaurantTableViewController

// can write to variables in RestaurantTableViewController if required

vc.someVariable = selectedRow

}

}

import UIKit

class RestaurantTableViewController: UITableViewController {

var secondArray = ["Item 2.1", "Item 2.2", "Item 2.3", "Item 2.4"]

var someVariable = -1

override func viewDidLoad() {

super.viewDidLoad()

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

return 1

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return secondArray.count

}

let nameOfCell = "RestaurantCell"

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier(nameOfCell, forIndexPath: indexPath) as UITableViewCell

cell.textLabel!.text = secondArray[indexPath.row]

if indexPath.row == selectedRow {

cell.textLabel!.text = cell.textLabel!.text! + " SELECTED"

}

return cell

}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

selectedRow = indexPath.row

}

}

字符串

tcbh2hod

tcbh2hod4#

我注意到在你的故事板截图中,segue将第一个prototype cell连接到RestaurantViewController。这个prototype cell看起来像是“Basic”样式的cell,右边有一个disclosure indicator附件。但是看看你的应用程序运行的屏幕截图。表格中填充的单元格似乎是“Subtitle”右侧没有显示指示器附件的单元格样式。
不管你做什么,你的segue永远不会被触发的原因是segue只被配置为特定的原型单元格工作,但是当你填充表时,这个原型单元格永远不会被使用。无论你在tableView:cellForRowAtIndexPath:中做什么,你都没有使用你想要的原型单元格。
@ Redis 有一个正确的想法,即用正确的标识符将正确的单元格解压缩,并将其与Interface Builder中原型单元格的标识符进行匹配。这样做之后出现的崩溃可能是因为上面评论中提到的前一个问题。你在故事板中的segue显然指向UITableViewController。你在prepareForSegue:sender:中的代码应该是let vc = segue.destinationViewController as RestaurantViewController,只要RestaurantViewControllerUITableViewController的子类。如果你试图将它转换为UINavigationController,你会崩溃。还要确保故事板中目标UITableViewController的类在身份检查器窗格中被列为RestaurantController。如果你的程序编译时认为故事板只包含一个泛型UITableViewController,你会崩溃。
回到最初的问题,我不知道你是如何实现tableView:cellForRowAtIndexPath:的,这可能是至关重要的。也许它并不那么简单。也许你计划在运行时处理许多原型单元格或生成自定义单元格。在这种情况下,一种简化的方法是当用户点击单元格时以编程方式执行segue。而不是使用特定的原型单元格,使segue连接从“Anchanger nära mig”UITableViewControllerRestaurantViewController。(在界面生成器中连接,方法是按住Control键并单击,从第一个控件顶部的“表视图控制器”图标拖动到第二个控件的主体).你必须在属性检查器面板中给给予这个segue一个标识符,让它变得有用。假设它是"toRestaurant"。然后在你的tableView:didSelectRowAtIndexPath:方法的结尾,放这行代码:self.performSegueWithIdentifier("toRestaurant", sender: self)。现在无论在表格中选择了哪个单元格,这个segue都会为你触发。

5uzkadbs

5uzkadbs5#

尝试在cellForRow方法中创建这样的单元格:

let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("MyTestCell", forIndexPath: indexPath)

字符串

z9ju0rcb

z9ju0rcb6#

我在这里一时兴起,因为我刚刚进入斯威夫特现在,但我在我的prepareForSegue()是这样做的方式:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "toRestaurant"{
        let navigationController = segue.destinationViewController as UINavigationController
        let vc = navigationController.topViewController as RestaurantViewController
        //notice I changed [i] to [index!.row]
        vc.data = currentResponse[index!.row] as NSArray
     }
    }

字符串
在我看来,你是在调用i变量,它有点像你的类的方法中的一个私有变量。你可以像@Syed Tariq对selectRow变量所做的那样,将它设置在class SomeController: UIViewController /*, maybe some more here? */ {之上,然后在你的

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    selectedRow = indexPath.row

}


这两种方法都是一样的,但效果都很好。

jdzmm42g

jdzmm42g7#

我遇到了同样的问题,我发现解决方案是:

performSegueWithIdentifier(“toViewDetails”,sender:self)

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var cellnumber = procMgr.processos[indexPath.row].numero
    println("You selected cell #\(indexPath.row)")
    println(cellnumber)
    performSegueWithIdentifier("toViewDetails", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "toViewDetails" {
         let DestViewController : ViewDetails = segue.destinationViewController as! ViewDetails
    }
}

字符串

gcxthw6b

gcxthw6b8#

您可能需要获取UItableview的选定单元格索引。下面的代码使用选定单元格索引(UItableview.indexPathForSelectedRow)来获取数组的正确元素。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "seguaVisitCardDetial" {
        let viewController = segue.destinationViewController as! VCVisitCardDetial
        viewController.dataThisCard =   self.listOfVisitCards[(tblCardList.indexPathForSelectedRow?.row)!]
    }
}

字符串

vlju58qv

vlju58qv9#

我也有这个问题没有调用来自可扩展ViewCell的segue。经过一番搜索,我发现这是因为我在“选择”字段中选择了“无选择”。

相关问题