使用两个不同的 UITableViewControllers 重用 UITableViewCell 的 IBOutlets
Reusing a UITableViewCell's IBOutlets with two different UITableViewControllers
我正在创建一个咖啡计时器作为学习练习,我希望根据所选的冲泡方法提供不同的菜单。我将我的设置存储在 NSUserDefaults 中,并用两个单独的数组填充我的 tables,如下所示:
var aero = ([
"Cool Down Time Enabled" : true,
"Cool Down Time" : 30,
"Inverted" : true,
"Base Steep Time" : 150,
"Base Inverted Steep Time" : 180,
])
var french = ([
"Cool Down Time Enabled" : true,
"Cool Down Time" : 30,
"Base Steep Time" : 180,
])
我创建了两个 UITableViewControllers,一个用于 FrenchPress,一个用于 AeroPress,它们基本上是相同的代码:
FrenchPressTableViewController.swift - 设置菜单
AeroPressTableViewController.swift - 设置菜单
两者都将值分配给我的 Setting.Swift class (gist) 的实例,并存储在不同的数组中。
在 IB 中,我从我的法式压力机控制器开始,创建了两个原型单元和两个原型 classes 以配合它们。
SwitchCell.Swift - 我的 UISwitch 原型电池插座模型
TimingCell.Swift - 为我的 TimingButton 原型电池插座建模
采取的初始步骤:
- 为我的 French Press 设置在 IB 中创建新的 table视图。
- 创建一个指定的FrenchPressTableViewController,并将其分配给我的新法压壶table视图
- 设置两个新的原型单元并使用我的 SettingCell & TimingCell classes 设置 IBOutlets/Actions。
- IBOutlets 从我的 FrenchPressTableViewController 连接到我的 SettingCell.swift(我后来将这些插座重新用于我的 Aero 设置)。
我的 FrenchPress 设置 工作正常:
所以我决定使用相同的过程添加我的 Aero 压力机设置菜单:
- 新建table在IB中查看
- 创建一个 AeroPressTableViewController,并将其分配给我的新 aero table 视图
- 设置两个新的原型单元并将我之前存在的 SettingCell 和 TimingCell 分配给正确的单元。
- 我利用之前连接到我的 FrenchPressTableViewController 的插座,并将它们连接到我的 Aero 控制器,以重复使用电池 classes。
最终产品看起来像这样:
但是当我 运行 我的 Aero 设置菜单时,出现以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
问题:
从我的调试器中可以看出,我的 SettingCell class 似乎正在返回一个 nil 值cell.switchLabel.text
。这对我来说没有意义,因为我正在尝试为其分配一个值。
显然我做错了什么,重用我的 UITableViewCell classes 的正确方法是什么?
将 UITableViewCell class 注册为 tableView.registerClass(SwitchCell.self,forCellReuseIdentifier:"SwitchCell2")
时会出现此问题
删除该行 tableView.registerClass(SwitchCell.self,forCellReuseIdentifier:"SwitchCell2")
并在情节提要中设置 cellIdentifier..它有效
我正在创建一个咖啡计时器作为学习练习,我希望根据所选的冲泡方法提供不同的菜单。我将我的设置存储在 NSUserDefaults 中,并用两个单独的数组填充我的 tables,如下所示:
var aero = ([
"Cool Down Time Enabled" : true,
"Cool Down Time" : 30,
"Inverted" : true,
"Base Steep Time" : 150,
"Base Inverted Steep Time" : 180,
])
var french = ([
"Cool Down Time Enabled" : true,
"Cool Down Time" : 30,
"Base Steep Time" : 180,
])
我创建了两个 UITableViewControllers,一个用于 FrenchPress,一个用于 AeroPress,它们基本上是相同的代码:
FrenchPressTableViewController.swift - 设置菜单
AeroPressTableViewController.swift - 设置菜单
两者都将值分配给我的 Setting.Swift class (gist) 的实例,并存储在不同的数组中。
在 IB 中,我从我的法式压力机控制器开始,创建了两个原型单元和两个原型 classes 以配合它们。
SwitchCell.Swift - 我的 UISwitch 原型电池插座模型
TimingCell.Swift - 为我的 TimingButton 原型电池插座建模
采取的初始步骤:
- 为我的 French Press 设置在 IB 中创建新的 table视图。
- 创建一个指定的FrenchPressTableViewController,并将其分配给我的新法压壶table视图
- 设置两个新的原型单元并使用我的 SettingCell & TimingCell classes 设置 IBOutlets/Actions。
- IBOutlets 从我的 FrenchPressTableViewController 连接到我的 SettingCell.swift(我后来将这些插座重新用于我的 Aero 设置)。
我的 FrenchPress 设置 工作正常:
所以我决定使用相同的过程添加我的 Aero 压力机设置菜单:
- 新建table在IB中查看
- 创建一个 AeroPressTableViewController,并将其分配给我的新 aero table 视图
- 设置两个新的原型单元并将我之前存在的 SettingCell 和 TimingCell 分配给正确的单元。
- 我利用之前连接到我的 FrenchPressTableViewController 的插座,并将它们连接到我的 Aero 控制器,以重复使用电池 classes。
最终产品看起来像这样:
但是当我 运行 我的 Aero 设置菜单时,出现以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
问题:
从我的调试器中可以看出,我的 SettingCell class 似乎正在返回一个 nil 值cell.switchLabel.text
。这对我来说没有意义,因为我正在尝试为其分配一个值。
显然我做错了什么,重用我的 UITableViewCell classes 的正确方法是什么?
将 UITableViewCell class 注册为 tableView.registerClass(SwitchCell.self,forCellReuseIdentifier:"SwitchCell2")
删除该行 tableView.registerClass(SwitchCell.self,forCellReuseIdentifier:"SwitchCell2")
并在情节提要中设置 cellIdentifier..它有效