我通过协议将数据从UITableViewController传递到UIViewController而不是int值我得到的nil。为什么?

时间:2016-03-21 16:19:51

标签: ios swift uiviewcontroller

我有两个UITableViewController,第一个:

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?

4 个答案:

答案 0 :(得分:0)

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

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

    返回Int 的协议中的
  1. getNumberOfRequests
  2. ListEvents应该实施协议,而不是UserProfileDetails
  3. 应删除getNumberOfRequests()中的空UserProfileDetails

答案 1 :(得分:0)

您没有设置<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script> <input type="checkbox" id="basic_single" name="basic_single" value="400"> <input type="checkbox" id="basic_double" name="basic_double" value="680"> <input type="text" name="total" value="" size="30" id="total">。当您使用故事板时,您应该设置listEvents不早于(覆盖)fetchInfo。以谷歌为例,网络上充满了它们。以编程方式进行segue时,可以在实际创建新视图控制器之前设置该属性。您最好使用prepareForSegue,因为在这种情况下,当listEvents为nil时,您将获得异常。

答案 2 :(得分: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)
    }
  }
}

答案 3 :(得分:0)

将数据从一个控制器移动到另一个控制器的想法非常普遍。大多数情况下,这是使用segue完成的。控制器可以有一个名为prepareForSegue的函数。在转换发生之前调用此函数。在prepareForSegue函数内部,系统为您提供目标控制器对象。您获取该对象并在其中设置数据。当转换发生并且您的目标控制器出现时,它已经拥有您想要提供给它的数据。

使用Xcode创建一个新项目。选择“Master-Detail Application”。这将为您生成代码,它是如何在控制器之间传递数据的一个很好的例子。