您可以通過賽段或協議傳遞數據。既然你在使用segues,我會向你展示一個完整的例子,以及如何在Swift 3中以正確的方式做到這一點。只使用兩個ViewController。
- 主「視圖控制器」創建兩個
UITextFields
。
- 創建一個類型爲
UIViewController
的新視圖控制器,將其稱爲「MainTabelViewController」並在其中添加一個tableView。選擇內容動態原型樣式分組並創建1個原型單元格,併爲其添加一個UILabel
以指定城市名稱。 「不要忘記把單元標識符名稱」。我把它叫做「cell」。
- 將代表和數據源添加到類中並像代碼中那樣添加其功能。
- 從主視圖控制器到主表視圖控制器創建一個segue。並創建另一個相反的方向。「不要忘了把SEGUE標識符名稱」我打電話給他們「toCity」 & 「toMain」
- 創建「CityTableViewCell」
UITableViewCell
型控制器,並創建一個UILabel
類型,其中的IBOutlet
您將以文本形式保存城市名稱。
在AppDelegate.swift
中編輯此部分每次啓動應用程序時刪除在UserDefaults
中保存的城市名稱。所以我不會每次隨機填寫UITextFields
。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var userDefaults: UserDefaults!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
userDefaults = UserDefaults.standard
userDefaults.removeObject(forKey: "City One")
userDefaults.removeObject(forKey: "City Two")
return true
}
這就是你有普通的主ViewController.swift
你UITextFields
英寸我區分哪些UITextField
沒有使用標籤的用戶點擊。您還需要添加UITextFieldDelegate
協議才能使用textFieldDidBeginEditing
函數。而且我還使用UserDefaults
課程保存所選城市名稱,以在用戶選擇其他城市時調用它們。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var cityOneLabel: UITextField!
@IBOutlet var cityTwoLabel: UITextField!
@IBOutlet var continueButton: UIButton!
var selectedCityOne = ""
var selectedCityTwo = ""
var userDefaults: UserDefaults!
override func viewDidLoad() {
super.viewDidLoad()
cityOneLabel.delegate = self
cityTwoLabel.delegate = self
cityOneLabel.tag = 1
cityTwoLabel.tag = 2
continueButton.isEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
userDefaults = UserDefaults.standard
cityOneLabel.text = selectedCityOne
cityTwoLabel.text = selectedCityTwo
if selectedCityOne != "" {
userDefaults.set(selectedCityOne, forKey: "City One")
} else {
cityOneLabel.text = userDefaults.string(forKey: "City One")
}
if selectedCityTwo != "" {
userDefaults.set(selectedCityTwo, forKey: "City Two")
} else {
cityTwoLabel.text = userDefaults.string(forKey: "City Two")
}
if cityOneLabel.text != "" && cityTwoLabel.text != "" {
continueButton.isEnabled = true
} else {
continueButton.isEnabled = false
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func continueButtonAction(_ sender: UIButton) {
//Later on continue after selecting the cities
}
func textFieldDidBeginEditing(_ textField: UITextField) {
performSegue(withIdentifier: "toCity", sender: textField.tag)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toCity" {
guard let cityVC = segue.destination as? MainTableViewController else {
return
}
cityVC.selectedTextField = sender as! Int
}
}
}
在CityTabelViewCell.swift
添加IBOutlet UILabel
的城市名稱。
import UIKit
class CityTableViewCell: UITableViewCell {
@IBOutlet var cityNameLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
對於MainTabelViewController.swift
這樣寫: 這裏是我創建的字符串來填充我的表視圖UILabels
與數組。
import UIKit
class MainTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var cityTabelView: UITableView!
var cityNamesArray = ["Cairo", "Alexandria", "Suez"]
var selectedTextField = Int()
var selectedCityName = ""
override func viewDidLoad() {
super.viewDidLoad()
cityTabelView.delegate = self
cityTabelView.dataSource = self
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CityTableViewCell
cell.cityNameLabel.text = cityNamesArray[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cityNamesArray.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedCityName = cityNamesArray[indexPath.row]
performSegue(withIdentifier: "toMain", sender: self)
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
var title = ""
if selectedTextField == 1 {
title = "City One"
} else if selectedTextField == 2 {
title = "City Two"
}
return title
}
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toMain" {
guard let mainVC = segue.destination as? ViewController else {
return
}
if selectedTextField == 1 {
mainVC.selectedCityOne = selectedCityName
} else if selectedTextField == 2 {
mainVC.selectedCityTwo = selectedCityName
}
}
}
}
這是我的佈局如何。嘗試一下。如果用戶在選擇這兩個城市後必須去另一個UIViewController
,我也只是添加了一個繼續按鈕。
在什麼VC我應該加這 – Ahmed
在表視圖VC去MainVC。只需添加一個全局變量,然後像在示例中那樣更改didSelectRowAt中的代碼,然後按照我在示例中所做的那樣編輯準備函數。 –
確保將具有有效標識符名稱的storyVC從drawVC繪製到main storyboard上的mainVC。 –