将数据从 UITableViewDataSource 发送回 UITableViewController
Send data back to UITableViewController from UITableViewDataSource
我有两个不同的 classes,它们都实现了 UITableViewDataSource
和 UITableViewDelegate
协议。它们与我的 UITableViewController
.
是分开的
我想选择正确的数据源 class 在 viewDidLoad()
中实例化,然后将 UITableViewController 设置为 UITableViewDataSource
和 UITableViewDelegate
[=32] 的委托=]是的。 (我 return 从这些 classes 到 UITableViewController 的一个对象,以便 prepareForSegue
知道在详细视图控制器屏幕中显示什么。)
这行不通。
在运行时,它会在没有运行时错误的情况下中断,只需使用 "Thread 1: EXC_BAD_ACCESS (code=1, address=...) the line "class AppDelegate: UIResponder, UIApplicationDelegate {"
但是,如果我将数据源对象定义为 UITableViewConroller 中的实例变量(而不是在 viewDidLoad()
中进行),那么它就可以工作。当然,这违背了目的,因为现在我无法切换到另一个数据源。
似乎如果我想将 UITableViewController 设置为委托(即,希望能够从数据源发回数据),那么出于某种原因我无法在 viewDidLoad() 中执行此操作。也许它还没有完成创建对象? (如果我将对象创建为实例变量并立即初始化它们,一切正常。)
protocol GroupByDelegator {
func callSegueFromGroupByDelegator()
}
class RemindersViewController: UITableViewController, GroupByDelegator {
@IBOutlet var remindersTableview: UITableView!
// var dataSource = GroupByNothingDataSource() // THIS WORKS, BUT THEN I CAN'T CHANGE THE DATASOURCE ANYMORE
var reminderWrapperToBeDisplayedInDetailView: ReminderWrapper?
override func viewDidLoad() {
super.viewDidLoad()
// if ... {
var dataSource = GroupByNothingDataSource() // BREAKS THE CODE
// } else {
// var dataSource = GroupByPriorityDataSource()
// }
dataSource.groupByDelegator = self // used so that the datasource can call the callSegueFromGroupByDelegator() func that will pass an object back to here.
self.tableView.dataSource = dataSource
self.tableView.delegate = dataSource
}
...
// This function is called by the data source delegates (GroupByNothingDataSource, GroupByPriorityDataSource) because they can't perform segues.
func callSegueFromGroupByDelegator(reminderWrapper: ReminderWrapper?) {
reminderWrapperToBeDisplayedInDetailView = reminderWrapper
//try not to send self, just to avoid retain cycles
self.performSegueWithIdentifier("reminderDetail", sender: tableView)
}
}
class GroupByPriorityDataSource: NSObject, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate, RemindersViewControllerDelegate {
var groupByDelegator: GroupByDelegator!
...
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
...
// Pass object back to UITableViewController
self.groupByDelegator.callSegueFromGroupByDelegator(reminderWrapper?)
}
}
我最终将两个数据源初始化为 class 实例变量(而不是根据用户交互仅动态初始化一个。)现在我根据用户交互动态地在已经初始化的数据源之间进行选择。
它解决了我的问题,但没有真正解决技术问题。这是平台的错误吗?
我有两个不同的 classes,它们都实现了 UITableViewDataSource
和 UITableViewDelegate
协议。它们与我的 UITableViewController
.
我想选择正确的数据源 class 在 viewDidLoad()
中实例化,然后将 UITableViewController 设置为 UITableViewDataSource
和 UITableViewDelegate
[=32] 的委托=]是的。 (我 return 从这些 classes 到 UITableViewController 的一个对象,以便 prepareForSegue
知道在详细视图控制器屏幕中显示什么。)
这行不通。
在运行时,它会在没有运行时错误的情况下中断,只需使用 "Thread 1: EXC_BAD_ACCESS (code=1, address=...) the line "class AppDelegate: UIResponder, UIApplicationDelegate {"
但是,如果我将数据源对象定义为 UITableViewConroller 中的实例变量(而不是在 viewDidLoad()
中进行),那么它就可以工作。当然,这违背了目的,因为现在我无法切换到另一个数据源。
似乎如果我想将 UITableViewController 设置为委托(即,希望能够从数据源发回数据),那么出于某种原因我无法在 viewDidLoad() 中执行此操作。也许它还没有完成创建对象? (如果我将对象创建为实例变量并立即初始化它们,一切正常。)
protocol GroupByDelegator {
func callSegueFromGroupByDelegator()
}
class RemindersViewController: UITableViewController, GroupByDelegator {
@IBOutlet var remindersTableview: UITableView!
// var dataSource = GroupByNothingDataSource() // THIS WORKS, BUT THEN I CAN'T CHANGE THE DATASOURCE ANYMORE
var reminderWrapperToBeDisplayedInDetailView: ReminderWrapper?
override func viewDidLoad() {
super.viewDidLoad()
// if ... {
var dataSource = GroupByNothingDataSource() // BREAKS THE CODE
// } else {
// var dataSource = GroupByPriorityDataSource()
// }
dataSource.groupByDelegator = self // used so that the datasource can call the callSegueFromGroupByDelegator() func that will pass an object back to here.
self.tableView.dataSource = dataSource
self.tableView.delegate = dataSource
}
...
// This function is called by the data source delegates (GroupByNothingDataSource, GroupByPriorityDataSource) because they can't perform segues.
func callSegueFromGroupByDelegator(reminderWrapper: ReminderWrapper?) {
reminderWrapperToBeDisplayedInDetailView = reminderWrapper
//try not to send self, just to avoid retain cycles
self.performSegueWithIdentifier("reminderDetail", sender: tableView)
}
}
class GroupByPriorityDataSource: NSObject, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate, RemindersViewControllerDelegate {
var groupByDelegator: GroupByDelegator!
...
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
...
// Pass object back to UITableViewController
self.groupByDelegator.callSegueFromGroupByDelegator(reminderWrapper?)
}
}
我最终将两个数据源初始化为 class 实例变量(而不是根据用户交互仅动态初始化一个。)现在我根据用户交互动态地在已经初始化的数据源之间进行选择。
它解决了我的问题,但没有真正解决技术问题。这是平台的错误吗?