2016-03-24 90 views
0

我学习迅速协议和委托pattern.But,我真的需要用下面的问题,帮助其返回我空结果斯威夫特代表和协议

在视图控制器1:

protocol GetAllDataProtocol{ 
    func didReadInfo(info : [[String:String]]) 
} 
class ViewController1 : { 
    var delegate : GetAllDataProtocol? 
    var info_data : [[String:String]] = [] 

    override func viewDidLoad() { 

     readData() 
    } 

    func readData(){ 
     info_data.append(["ID" :"234FD","ADDRESS":"Maimi","TYPE":"A"]) 
     delegate?.didReadInfo(info_data) 
    } 
} 

然后在视图控制器2 :

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
     var info_data = [[String:String]]() 

     @IBAction func submitTapped(sender: AnyObject) { 
      print("After : \(info_data)") 
     } 

     func didReadInfo(info: [[String : String]]) { 
      dispatch_async(dispatch_get_main_queue(),{ 
       self.info_data = info 
       print("Before : \(self.info_data)") 
      }) 
     } 
} 

当运行

After : [] 

为什么它没有运行“之前?”以及为什么我无法获取数据。

+0

何时/你在哪里设置代表? 'x.delegate = y'? – Wain

+0

对不起,延迟回复,我有点忙于工作。实际上,我使用uitabbarcontroller.i只是想将一个数据从一个标签传输到另一个标签。 –

回答

1

SubmissionViewController应该在ViewController1上有引用。在viewDidLoad()方法中,将viewController.delegate分配给self。

代码:

class SubmissionViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate,GetAllDataProtocol{ 
    var info_data = [[String:String]]() 
    var viewController1:ViewController1? 

    override func viewDidLoad() { 
     //You should here load viewController1 or connect it by outlet in above 
     let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil) 
     viewController1 = storyboard.instantiateViewControllerWithIdentifier("ViewController1") as? ViewController1 
     self.viewController1!.delegate = self 
    } 
    @IBAction func submitTapped(sender: AnyObject) { 
     print("After : \(info_data)") 
    } 

    func didReadInfo(info : [[String:String]]) { 
     dispatch_async(dispatch_get_main_queue(),{ 
      self.info_data = info 
      print("Before : \(self.info_data)") 
     }) 
    } 
} 
+0

我会试一试...感谢您的帮助 –

1

您没有设置委托的引用作为艾哈迈德Lotfy解释。

也许你错过了协议只是一种模板或承诺。所以,如果你定义一个协议与功能

func didReadInfo(info : [[String:String]]) 

你说“嘿,每一个符合协议XYZ类应该已经实现了这个方法。”通过在应该符合协议“GetAllDataProtocol”的“ViewController1”类上声明委托变量,您只需确保可以在该对象上调用函数“didReadInfo”。但这个变量没有设置在任何地方,这就是为什么你的电话

delegate?.didReadInfo(info_data) 

没有效果。 “委托?”的可选链接。不成功,并且函数“didReadInfo”永远不会被调用。