2016-03-21 29 views
1

我有两个UITableViewController中,第一个:我通过协议将数据从UITableViewController传递给UIViewController,而不是int值,我得到零。为什么?

protocol FetchUserProfileData { 
    func getNumberOfRequests() 
} 

class ListEvents: UITableViewController{ 
    var fetchInfo:FetchUserProfileData? 

    func getNumberOfRequests() -> Int{ 
     return 12 
    } 

和UIViewController的:

class UserProfileDetails:UIViewController, FetchUserProfileData { 

var listEvents: UserListEvents? 

func getNumberOfRequests(){ 

    } 

override func viewDidLoad(){ 
listEvents?.fetchInfo = self 
print(listEvents?.getNumberOfRequests()) 

这行:print(listEvents?.getNumberOfRequests())给我nil值,而不是12 ...什么是错在这里?

----编辑 好吧,现在我看到listEvents是空的...所以我的问题是我怎么能从ListEvents传递数据到UserProfileDetails?

+0

请详细说明您打算如何使用协议将数据从一个控制器传递到另一个控制器。据我所知,协议不能用来交换数据。协议只定义了一组实现该协议的类必须具有的功能。 – ryantxr

+0

嗯我只是认为,当我这样做就像我试过 - 返回一个int值与函数,然后我将有一个直接访问该值...你能告诉我如何正确地传递它? – user3766930

回答

0

在此代码中,listEvents可能为零。

但是,您使用协议的方式对我来说看起来很奇怪。我希望:

  1. getNumberOfRequests在协议返回诠释
  2. ListEvents应执行该协议,而不是UserProfileDetails
  3. UserProfileDetailsgetNumberOfRequests()应删除
+0

好的,谈到第二点 - 我很困惑,因为我想将ListEvents中的数据传递给UserProfileDetails,而不是其他方式,所以我认为我做对了吗?你能告诉我一些简单的例子,比如块模式或者我怎么能传递那些数据呢? – user3766930

0

您没有设置listEvents。当你使用故事板时,你应该设置fetchInfo不要早于(覆盖)prepareForSegue。谷歌的例子,网络充满了他们。当您以编程方式继续时,您可以在实际上实现新视图控制器之前设置属性。你最好使用listEvents!.fetchInfo = self,因为在那种情况下,当listEvents为零时你会得到一个异常。

0

我做了一些改变你的代码,这会将数据从ListEvents传递给UserProfileDetails。

protocol FetchUserProfileDelegate { 
    func getNumberOfRequests()->Int 
} 

class ListEvents: UITableViewController,FetchUserProfileDelegate{ 
    var userProfile: UserProfileDetails? 
    override func viewDidLoad() { 
    userProfile = UserProfileDetails() 
    userProfile?.delegate = self 
    } 
    // MARK: FetchUserProfileDelegate 
    func getNumberOfRequests() -> Int{ 
    return 12 // return as your target Int 
    } 
} 

class UserProfileDetails:UIViewController { 

    var delegate:FetchUserProfileDelegate? 

    override func viewDidLoad() { 
    if let _ = delegate{ 
     let resultInt = delegate?.getNumberOfRequests() // get the Int form ListEvents 
     print(resultInt) 
    } 
    } 
} 
+0

谢谢,我试过这种确切的方式,但不知何故,我不进入'如果让_ =委托{...'块,你知道我怎么解决它? – user3766930

+0

我在原始问题中没有提及它,我不确定它是否会更改解决方案的概念,但这两个面板('UITableViewController'和'UIViewController')都嵌入存储在另一个'UIViewController ' - 这可能是您当前的解决方案无法正常工作的原因吗? – user3766930

0

将数据从一个控制器移动到另一个控制器的想法很常见。大多数情况下,这是使用segue完成的。控制器可以有一个名为prepareForSegue的函数。这个函数在转换发生之前被调用。在prepareForSegue函数内部,系统为您提供目标控制器对象。你拿这个对象并在其中设置你的数据。当转换发生时,并且您的目标控制器启动后,它已经有了您想要给它的数据。

使用Xcode并创建一个新项目。选择“主 - 细节应用程序”。这将为您生成代码,这是如何在控制器之间传递数据的一个很好的例子。

相关问题