专门为 VC 函数创建 swift 文件
Creating a swift File specially for VC Functions
我目前的VC有多行代码。它有多种功能,我想放在一个单独的文件中。每个函数都使用解析数据获取...
我的 VC 目前有这个示例函数,它在 ViewDidLoad 中使用各种数组调用。如您所见,我的 VC:
调用了各种数组和字符串
// My View Controller //
func getData() {
let query = PFQuery(className: "Bar")
query.order(byAscending: "Priority")
query.whereKey("College", equalTo: college)
query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
if let objects = objects {
for object in objects {
if error == nil {
if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
self.ArraySelected.append(object["Bar"] as! String)
self.dealArray.append(object["Deal"] as! String)
self.dealTypeArray.append(object["DealType"] as! String)
self.barRankArray.append(object["Rank"] as! String)
let barImageFile = object["BarImage"] as? PFFileObject
let barUrlString = barImageFile?.url as! String
if let url = URL(string: barUrlString) {
let data = try? Data(contentsOf: url)
if let imageData = data {
self.barUrlArray.append(barUrlString as NSString)
self.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
self.barImageDataArray.append(imageData)
}
}
}
}
}
print(self.ArraySelected)
self.barDisplayedTableView.reloadData()
}
})
}
我的步骤是创建一个 class 来容纳所有这样的函数。我还创建了我的 VC 的实例。我还制作了 NSObject 类型的 class。我不确定这是正确的:
import UIKit
import Parse
//Not sure about this
class ListofBarsVCActions: NSObject {
//Not sure about this
let sharedInstance = ListofBarsViewController()
func getData() {
let query = PFQuery(className: "Bar")
query.order(byAscending: "Priority")
query.whereKey("College", equalTo: sharedInstance.college)
query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
if let objects = objects {
for object in objects {
if error == nil {
if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
self.sharedInstance.ArraySelected.append(object["Bar"] as! String)
self.sharedInstance.dealArray.append(object["Deal"] as! String)
self.sharedInstance.dealTypeArray.append(object["DealType"] as! String)
self.sharedInstance.barRankArray.append(object["Rank"] as! String)
let barImageFile = object["BarImage"] as? PFFileObject
let barUrlString = barImageFile?.url as! String
if let url = URL(string: barUrlString) {
let data = try? Data(contentsOf: url)
if let imageData = data {
self.sharedInstance.barUrlArray.append(barUrlString as NSString)
self.sharedInstance.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
self.sharedInstance.barImageDataArray.append(imageData)
}
}
}
}
}
self.sharedInstance.barDisplayedTableView.reloadData()
}
})
}
override init() {
// do initial setup or establish an initial connection
}
}
从那里我回到我的 VC 并首先创建一个我刚刚创建的 class 的实例。然后我在 viewdidload 中调用 getData() 函数。
//My VC//
let ListofBarsVCInstance = ListofBarsVCActions()
//ViewDidLoad://
self.ListofBarsVCInstance.getData()
从那里我崩溃了。访问错误。我知道我的代码有问题,但我不知道确切的地方。我是一名新程序员,这对我来说是一个很大的转变。
如果您只是为了方便将一些函数移动到另一个文件中,那么您需要一个扩展,而不是一个额外的对象。摆脱 sharedInstance 而是:
extension ListofBarsViewController {
... Functions you want in this file ...
}
也就是说,想要这样做表明视图控制器做了太多工作,您应该将更多这种逻辑移到您的模型中 类 并使视图控制器更简单。
这是 MVC 的基本实现。您有一个可以调用模型和视图的控制器。现在,您可以将服务调用移至模型对象。
self.view.addSubview(UILabel())
self.model.printSomething()
class EventsViewController: UIViewController {
var model: EventsViewModel?
override func viewDidLoad() {
super.viewDidLoad()
model = EventsViewModel(self)
model?.printSomething()
}
}
class EventsViewModel: NSObject {
weak private var controller: EventsViewController?
init(_ controller: EventsViewController) {
self.controller = controller
}
func printSomething() {
print("printSomething")
}
}
我目前的VC有多行代码。它有多种功能,我想放在一个单独的文件中。每个函数都使用解析数据获取...
我的 VC 目前有这个示例函数,它在 ViewDidLoad 中使用各种数组调用。如您所见,我的 VC:
调用了各种数组和字符串 // My View Controller //
func getData() {
let query = PFQuery(className: "Bar")
query.order(byAscending: "Priority")
query.whereKey("College", equalTo: college)
query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
if let objects = objects {
for object in objects {
if error == nil {
if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
self.ArraySelected.append(object["Bar"] as! String)
self.dealArray.append(object["Deal"] as! String)
self.dealTypeArray.append(object["DealType"] as! String)
self.barRankArray.append(object["Rank"] as! String)
let barImageFile = object["BarImage"] as? PFFileObject
let barUrlString = barImageFile?.url as! String
if let url = URL(string: barUrlString) {
let data = try? Data(contentsOf: url)
if let imageData = data {
self.barUrlArray.append(barUrlString as NSString)
self.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
self.barImageDataArray.append(imageData)
}
}
}
}
}
print(self.ArraySelected)
self.barDisplayedTableView.reloadData()
}
})
}
我的步骤是创建一个 class 来容纳所有这样的函数。我还创建了我的 VC 的实例。我还制作了 NSObject 类型的 class。我不确定这是正确的:
import UIKit
import Parse
//Not sure about this
class ListofBarsVCActions: NSObject {
//Not sure about this
let sharedInstance = ListofBarsViewController()
func getData() {
let query = PFQuery(className: "Bar")
query.order(byAscending: "Priority")
query.whereKey("College", equalTo: sharedInstance.college)
query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
if let objects = objects {
for object in objects {
if error == nil {
if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
self.sharedInstance.ArraySelected.append(object["Bar"] as! String)
self.sharedInstance.dealArray.append(object["Deal"] as! String)
self.sharedInstance.dealTypeArray.append(object["DealType"] as! String)
self.sharedInstance.barRankArray.append(object["Rank"] as! String)
let barImageFile = object["BarImage"] as? PFFileObject
let barUrlString = barImageFile?.url as! String
if let url = URL(string: barUrlString) {
let data = try? Data(contentsOf: url)
if let imageData = data {
self.sharedInstance.barUrlArray.append(barUrlString as NSString)
self.sharedInstance.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
self.sharedInstance.barImageDataArray.append(imageData)
}
}
}
}
}
self.sharedInstance.barDisplayedTableView.reloadData()
}
})
}
override init() {
// do initial setup or establish an initial connection
}
}
从那里我回到我的 VC 并首先创建一个我刚刚创建的 class 的实例。然后我在 viewdidload 中调用 getData() 函数。
//My VC//
let ListofBarsVCInstance = ListofBarsVCActions()
//ViewDidLoad://
self.ListofBarsVCInstance.getData()
从那里我崩溃了。访问错误。我知道我的代码有问题,但我不知道确切的地方。我是一名新程序员,这对我来说是一个很大的转变。
如果您只是为了方便将一些函数移动到另一个文件中,那么您需要一个扩展,而不是一个额外的对象。摆脱 sharedInstance 而是:
extension ListofBarsViewController {
... Functions you want in this file ...
}
也就是说,想要这样做表明视图控制器做了太多工作,您应该将更多这种逻辑移到您的模型中 类 并使视图控制器更简单。
这是 MVC 的基本实现。您有一个可以调用模型和视图的控制器。现在,您可以将服务调用移至模型对象。
self.view.addSubview(UILabel())
self.model.printSomething()
class EventsViewController: UIViewController {
var model: EventsViewModel?
override func viewDidLoad() {
super.viewDidLoad()
model = EventsViewModel(self)
model?.printSomething()
}
}
class EventsViewModel: NSObject {
weak private var controller: EventsViewController?
init(_ controller: EventsViewController) {
self.controller = controller
}
func printSomething() {
print("printSomething")
}
}