Ios 将数据从UITableViewDataSource发送回UITableViewController

Ios 将数据从UITableViewDataSource发送回UITableViewController,ios,uitableview,delegates,Ios,Uitableview,Delegates,我有两个不同的类,它们都实现了UITableViewDataSource和UITableViewDelegate协议。它们与我的UITableViewController是分开的 我想选择要在viewDidLoad()中实例化的正确数据源类,然后将UITableViewController设置为UITableViewDataSource和UITableViewDelegate类的委托。(我将这些类中的一个对象返回到UITableViewController,以便prepareforsgue知道在

我有两个不同的类,它们都实现了
UITableViewDataSource
UITableViewDelegate
协议。它们与我的
UITableViewController
是分开的

我想选择要在
viewDidLoad()
中实例化的正确数据源类,然后将UITableViewController设置为
UITableViewDataSource
UITableViewDelegate
类的委托。(我将这些类中的一个对象返回到UITableViewController,以便
prepareforsgue
知道在细节视图控制器屏幕中显示什么。)

这不管用

在运行时,它会在没有运行时错误的情况下中断,只需“线程1:EXC_BAD_ACCESS(code=1,address=…)行”类AppDelegate:UIResponder,UIApplicationLegate{

但是,如果我在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?)
    }
}