Swift - Class没有初始化程序

时间:2016-10-08 03:15:10

标签: ios swift xcode parameter-passing

我试图通过代码将变量传递给另一个视图。当用户点击表格视图数据时,我的应用会将表格数据传递到下一个视图。但是我的第二个屏幕上有一个“班级没有初始化者”:

点击时调用第二个屏幕的表视图:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{       
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("editFriend") as! EditFriendViewController

self.presentViewController(nextViewController, animated: true, completion: nil)

nextViewController.friend = friendArray[indexPath.row];
}

第二屏幕代码:

import UIKit
import CoreData

class EditFriendViewController: UIViewController {

var friend: Friends

@IBOutlet weak var fName: UITextField!
@IBOutlet weak var lName: UITextField!
@IBOutlet weak var mobile: UITextField!
@IBOutlet weak var gender: UIPickerView!
@IBOutlet weak var address: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    fName.text = friend.firstName!;
    lName.text = friend.lastName!;
    mobile.text = friend.mobile!;
    address.text = friend.address!;   
}

}

3 个答案:

答案 0 :(得分:2)

那是因为你已经在init()方法中定义了一个属性而没有初始化它。如果你需要一个属性来初始化而不是init方法,例如。 viewDidLoad。这在ViewController中很常见。因此,您需要将属性定义为隐式展开的可选,这意味着您需要将friend声明为Friends!而不是Friends,或者如果您需要属性是可选的,然后将其声明为Friend?

import UIKit
import CoreData

class EditFriendViewController: UIViewController {
    var friend: Friends!  // declare friend as implicitly unwrapped optional, you are responsible to assign any value to it before using it
    ....

    override func viewDidLoad() {
       super.viewDidLoad()
       friend = Friend() // Assign a value to friend property
    }
}

答案 1 :(得分:1)

添加@Enix和@Shailesh的答案, 在显示nextViewController

之后,我可以看到您将数据传递给viewController

因此,我认为你不会在下一个VC中获得价值,你总会得到nil

因此在呈现viewController之前传递数据。

要替换的代码

self.presentViewController(nextViewController, animated: true, completion: nil)
nextViewController.friend = friendArray[indexPath.row];

BY

nextViewController.friend = friendArray[indexPath.row];
self.presentViewController(nextViewController, animated: true, completion: nil)

答案 2 :(得分:0)

将朋友变量设为可选

     var friend: Friends? 

在访问该值时使用

   if let friend = friend {
       //use friend value to assign to values to label  }

编译器告诉你朋友变量没有初始化器。类的所有变量都应该通过init方法具有初始值,或者它们应该被声明为可选项。并且在你用单行写入表达式或语句之前,分号也不是强制性的,所以你可以在最后删除分号。