我遇到了与我的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
}
}
型
9条答案
按热度按时间2guxujil1#
问题是你没有正确处理你的数据。如果你查看你的
currentResponse
数组,你会看到它保存了NSDictionary,但在你的prepareForSegue
中,你试图将NSDictionary转换为NSArray,这将使应用程序崩溃。将
RestaurantViewController
中的data
变量更改为NSDictionary,并将prepareForSegue
更改为传递NSDictionary字符串
对于Swift 5
型
fhg3lkii2#
以下步骤应该可以解决您的问题。如果不能,请让我知道。
1.删除您的
tableView(tableView, didSelectRowAtIndexPath:)
实现。1.使
RestaurantViewController
上的data
具有NSDictionary!
类型1.确定
prepareForSegue
中的选定行:字符串
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。如果你正确地拖动控制,应该会有确认提示,以及连接检查器中的一个条目。
不幸的是,我只是不能得到正确的格式化代码
字符串
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
,只要RestaurantViewController
是UITableViewController
的子类。如果你试图将它转换为UINavigationController
,你会崩溃。还要确保故事板中目标UITableViewController
的类在身份检查器窗格中被列为RestaurantController
。如果你的程序编译时认为故事板只包含一个泛型UITableViewController
,你会崩溃。回到最初的问题,我不知道你是如何实现
tableView:cellForRowAtIndexPath:
的,这可能是至关重要的。也许它并不那么简单。也许你计划在运行时处理许多原型单元格或生成自定义单元格。在这种情况下,一种简化的方法是当用户点击单元格时以编程方式执行segue。而不是使用特定的原型单元格,使segue连接从“Anchanger nära mig”UITableViewController
到RestaurantViewController
。(在界面生成器中连接,方法是按住Control键并单击,从第一个控件顶部的“表视图控制器”图标拖动到第二个控件的主体).你必须在属性检查器面板中给给予这个segue一个标识符,让它变得有用。假设它是"toRestaurant"
。然后在你的tableView:didSelectRowAtIndexPath:
方法的结尾,放这行代码:self.performSegueWithIdentifier("toRestaurant", sender: self)
。现在无论在表格中选择了哪个单元格,这个segue都会为你触发。5uzkadbs5#
尝试在
cellForRow
方法中创建这样的单元格:字符串
z9ju0rcb6#
我在这里一时兴起,因为我刚刚进入斯威夫特现在,但我在我的
prepareForSegue()
是这样做的方式:字符串
在我看来,你是在调用i变量,它有点像你的类的方法中的一个私有变量。你可以像@Syed Tariq对
selectRow
变量所做的那样,将它设置在class SomeController: UIViewController /*, maybe some more here? */ {
之上,然后在你的型
这两种方法都是一样的,但效果都很好。
jdzmm42g7#
我遇到了同样的问题,我发现解决方案是:
performSegueWithIdentifier(“toViewDetails”,sender:self)
字符串
gcxthw6b8#
您可能需要获取UItableview的选定单元格索引。下面的代码使用选定单元格索引(UItableview.indexPathForSelectedRow)来获取数组的正确元素。
字符串
vlju58qv9#
我也有这个问题没有调用来自可扩展ViewCell的segue。经过一番搜索,我发现这是因为我在“选择”字段中选择了“无选择”。