我正在编写我的第一个iOS应用程序,并且正在学习协议和委派。该应用程序是一个基本的随机响应生成器当用户摇动设备或点击屏幕时,随机响应应显示在标签中。
目前,我在导航控制器中嵌入了三个视图控制器:MainViewController.swift
,SettingsViewController.swift
和ResponsesViewController.swift
。
我在MainViewController.swift
中有一个包含响应的数组。我已经成功地将数据传递给第三个视图控制器,即ResponsesViewController.swift
,它是一个用于显示存储响应的表视图。我已将第一个视图控制器MainViewController
设置为我的第三个视图控制器ResponsesViewController
的委托,并实现了我想从数据模型中删除所选响应的方法({{1} } array)。
我的问题是当我尝试删除响应时,我在控制台中得到responses
。我使用fatal error: Cannot index empty buffer
来确保我成功地将数组传递给第二个和第三个视图控制器。我将println(responses.count)
语句放在方法println(responses.count)
,viewDidLoad()
和viewWillAppear()
中的所有三个视图控制器中。这表明数据传递成功,因为数组中有3个对象,每个viewDidDisappear()
语句。但是,在我的代理println()
中,当我尝试从数据模型中删除选定的响应时,我不断收到错误。我将MainViewController.swift
放入此方法,但它一直返回println(responses.count)
并因错误而崩溃。只有在委托(0
)
func responsesViewController(controller: ResponsesViewController, didDeleteResponseAtIndexPath indexPath: NSIndexPath)
时才会发生这种情况
这是我的代码:
MainViewController.swift
MainViewController.swift
var responses: [Response] = []
let response1 = Response(text: "String 1")
let response2 = Response(text: "String 2")
let response3 = Response(text: "String 3")
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBarHidden = true
responses += [response1, response2, response3]
}
* delegate *
func responsesViewController(controller: ResponsesViewController, didDeleteResponseAtIndexPath indexPath: NSIndexPath) {
responses.removeAtIndex(indexPath.row)
}
ResponsesViewController.swift
- 编辑 -
事实证明,我能够通过简单地将数组从第三个视图控制器传递回第一个视图控制器来解决我的问题。我显然对代表团感到困惑。这是我更新的代码,我从数组中删除了项目,然后将该数组传递回第一个视图控制器:
protocol DeleteResponseDelegate {
func responsesViewController(controller: ResponsesViewController, didDeleteResponseAtIndexPath indexPath: NSIndexPath)
}
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
delegate?.responsesViewController(self, didDeleteResponseAtIndexPath: indexPath)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
tableView.reloadData()
}
}
ResponsesViewController.swift
答案 0 :(得分:-1)
来自你的评论 -
我假设MainViewController中的响应数组仍然存在 持有它创建的对象。这是不正确的?是吗? 数据通过视图控制器传输,只有一个实例 数组在任何时候?
对于NSArray来说,这是一个对象。 Swift数组是结构,结构是值类型。分配值时会复制值类型。
实际上,Swift-integers中的所有基本类型都是浮点数 数字,布尔值,字符串,数组和字典 - 是值类型, 并在幕后实现为结构。
所有结构和枚举都是Swift中的值类型。这意味着 您创建的任何结构和枚举实例 - 以及任何值 它们作为属性的类型 - 在传递时始终被复制 在你的代码中。“
摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/au/jEUH0.l