使用代理和封装/ ARC

时间:2014-07-25 13:10:46

标签: ios objective-c delegates swift

所以我用以下方式创建了一个委托:

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在屏幕上没有变化。我的问题是,如何修改此代码以使其按预期发生?

以下是我的故事板的图片:

http://imgur.com/z09dapF

帮助将不胜感激!

编辑:

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是问题所在,谢谢。

2 个答案:

答案 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;   
}