我上周在我的个人资料中发布了一个问题,想知道如何使用prepare for segue函数将信息从一个表控制器传输到另一个表控制器。我对如何自己设置控制器有一个基本的了解,但正如我的问题所示,我正在寻找一些帮助来理解所提供代码的一些细节。
以下是最重要的代码片段(请记住,这些代码来自表控制器。 在第一个控制器中,我有
var countries = ["American", "Asian", "Italian"]
var items = [["Mcdonalds", "BurgerKing", "Big Boy"], ["PFChangs", "China One Buffet"], ["Pizza House", "Pizza Hit", "Olive Garden", "Maggianos"]]
if (segue.identifier == "segueone")
{
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
if let unwrappedCellindexPath = cellIndexPath
{
var nextVC = (segue.destinationViewController as TableTwo)
nextVC.items = items[unwrappedCellindexPath.row]
}
}
}
在第二个表控制器上我有
var items: [String]?
所以我的问题如下。 1。"让cellIndexPath = self.table!.indexpathforCell(发送者为UITableViewCell"。我明白我正在设置cellIndexPath,一个常量,等于indexPathForCell,它是表格中单元格的索引路径,但是,为什么我需要"!"当价值(对我目前的信念)总是会返回一个值而从不为零?
indexPath和indexPath.row有什么区别?或者它们是一样的吗?
有没有其他方法可以实现if语句的结果?我从未见过"如果"和"让"以前的情况。
在问题2的路线上,为什么我需要添加" .row"到了#34; unwrappedcellindexpath"如果"如果"声明?为什么我现在需要添加它?
就像1,为什么" [string]"需要一个"?"之后
我为这些问题道歉并且我知道Apple的开发者网站,但我通常会做更多的个人回复......就像在答案中,用不同的方式回答。
无论如何,谢谢你的帮助!
答案 0 :(得分:2)
第一个(无编号)问题:你需要"!"因为你的self.table被声明为"可选"。这意味着它可能是一个有效值,或者它可能是零。编译器不会让你取消引用一个可选的,而不用#34; unwrapping"它
"!"是一个强迫解开"。这意味着,该死的,我知道这不会是零。让我使用它。"
如果变量/常量在运行时为空,则在强制解包时崩溃。
另一个选项叫做"可选绑定"。为此,你使用"如果让"句法。这可能看起来像这样:
if let requiredObject = optional
{
//code using requiredObject.
}
else
{
//the optional was nil
}
检查可选项是否为零。如果是,它就会停止。如果不是,则将可选项复制到所需的常量,然后执行大括号内的代码。然后,您可以使用新的" requiredObject"在括号内不断变化并知道它总是有效的。
#2。 NSIndexPath
是包含多个值的NSObject。它们旨在用于多用途,并包含可变数量的值。在iOS中,我从未见过它用于除了一个部分和一行之外的任何东西。 NSIndexPath
的iOS风格包含属性section
和row
(它们是整数)。对于单个部分的tableview,您只需使用indexPath.row
来获取单元格编号。
#3。见#1。 "如果让"可选的绑定让您忘记感叹号。如果变量不是nil,则大括号内的代码运行,并且新常量保证不为零。另一种方法是在任何地方使用if variable? != nil
,或简单地使用`变量!"如果你确定它不会是零。
#4。见#2。
#5:代码var items: [String]?
表示"定义名为items的可选变量,类型为array的字符串。它将指向一个有效的数组,或者它可能是nil。
你真的需要阅读Apple的Swift语言iBook。我在周末读了它。它解释了所有这些。