【问题标题】:Swift - Class has no initializerSwift - 类没有初始化器
【发布时间】:2023-04-02 20:12:01
【问题描述】:

我正在尝试通过代码将变量传递给另一个视图。当用户单击表视图数据时,我的应用程序会将表数据传递到下一个视图。但是我在第二个屏幕上看到“类没有初始化程序”:

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

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!;   
}

}

【问题讨论】:

标签: ios swift xcode parameter-passing


【解决方案1】:

那是因为您在 init() 方法中定义了一个属性而没有对其进行初始化。如果您需要在其他地方而不是 init 方法中初始化属性,例如。 viewDidLoad。这在 ViewController 中很常见。所以你需要将属性定义为implicitly unwrapped optional,也就是说,你需要将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
    }
}

【讨论】:

  • 嘿,我摆脱了错误。但现在我似乎无法获取朋友对象中的数据。当我尝试将对象的数据写入文本框时,出现“在取消可选值时意外发现 nil”错误。
  • @Janmenjaya 为您提供有关问题的提示。试试他的回答。您应该在呈现视图控制器之前将值分配给朋友。
【解决方案2】:

将朋友变量设为可选

     var friend: Friends? 

在访问值时使用

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

编译器告诉你朋友变量没有初始化器。一个类的所有变量都应该通过 init 方法具有初始值,或者它们应该被声明为可选项。而且分号在 swift 中不是强制性的,除非您在单行中写入表达式或语句,因此您可以删除末尾的分号。

【讨论】:

    【解决方案3】:

    添加到@Enix 和@Shailesh 的答案, 我可以看到你正在将数据传递给nextViewController,在呈现viewController之后,

    因此我认为你不会在 nextVC 中获得价值,你总是会在那里获得nil

    所以在呈现 viewController 之前传递数据。

    要替换的代码

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

    作者

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

    【讨论】: