所以我用以下方式创建了一个委托:
class MessengerTableViewController: UITableViewController, MessengerTableViewControllerDelegate, UITableViewDataSource, UITextFieldDelegate {
//..Insert Various functions Here..
func messengerScrollToBottom() {
self.tableView.setContentOffset(CGPointMake(0, CGFLOAT_MAX), animated: true)
}
}
协议是:
protocol MessengerTableViewControllerDelegate {
func messengerScrollToBottom()
}
使用messengerScrollToBottom()的类是superView:
class ContainerViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var containerViewController : UIView
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
self.msgDelegate = MessengerTableViewController(coder: nil)
}
func keyboardWillShow(aNotification: NSNotification) {
self.msgDelegate!.messengerScrollToBottom()
}
}
这不起作用,因为在ContainerViewController init()
函数中,msgDelegate
未分配给正确的MessageTableViewController
。它没有指向内存中故事板已创建的MessengerTableViewController
。因此代码执行正常,但我看到tableView在屏幕上没有变化。我的问题是,如何修改此代码以使其按预期发生?
以下是我的故事板的图片:
帮助将不胜感激!
编辑:
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController ].
if segue?.identifier == "tableView" {
let child = segue!.destinationViewController as? MessengerTableViewController
self.msgDelegate = child
}
// Pass the selected object to the new view controller.
}
我实现了上面的代码,现在它可以正常工作。除了一个捕获。执行messengerScrollToBottom()
时,tableView为空。谁知道为什么?
第二次编辑:结果是CGFLOAT_MAX是问题所在,谢谢。
答案 0 :(得分:0)
也许尝试在头文件中声明MessageTableViewController
属性,然后将其绑定到故事板中的MessageTableViewController
?然后在init()
中,您可以将该属性指定为对象的委托?
答案 1 :(得分:0)
您需要在转到MessengerTableViewController时设置委托。由于您使用的是segue,因此您应该在prepareForSegue中执行此操作。使用segue.destinationViewController获取对MessengerTableViewController的引用。
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
let messengerTVC: MessengerTableViewController = segue.destinationViewController as ViewController
self.msgDelegate = messengerTVC;
}