2017-05-12 87 views
1

see this image如何與集裝箱

see this gif

執行SEGUE到VC的時候,我選擇了城市地中海,它傳遞給TableVC不給FirstVC(MainVC)

我能做到這一點?通過容器(TableVC)通過 傳遞的數據繼續到主VC。

在這裏我做了什麼至今

MainVC

TableVC

import UIKit 

class passedViewController: UITableViewController { 

@IBOutlet weak var passcelltow: UITableViewCell! 
@IBOutlet weak var passcell: UITableViewCell! 

var passedCity1 = "اختر المدينة الاولى" 
var passedCity2 = "اختر المدينة الثانية" 
override func viewDidLoad() { 
    super .viewDidLoad() 

    passcell.textLabel?.text = passedCity1 
    passcelltow.textLabel?.text = passedCity2 

} 

} 

表1中的數據傳遞到TableVC

進口的UIKit

class city2ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource{ 
@IBOutlet weak var tableView: UITableView! 

var city2 = ["RUH" , "Med" , "Jed"] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return city2.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell() 
    print(indexPath.row) 

    cell.textLabel?.text = city2[indexPath.row] 

    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "show", sender: city2[indexPath.row]) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    let passing = segue.destination as! passedViewController 

    passing.passedCity2 = sender as! String 

} 




} 

表2是相同..

讚揚錯誤類型的

0 1 2無法投值 '的UIViewController'(0x107a10288)至 'table_view_test_pass.passedViewController'(0x105dbfdf8)。 (LLDB)

回答

1

您可以通過賽段或協議傳遞數據。既然你在使用segues,我會向你展示一個完整的例子,以及如何在Swift 3中以正確的方式做到這一點。只使用兩個ViewController。

  1. 「視圖控制器」創建兩個UITextFields
  2. 創建一個類型爲UIViewController的新視圖控制器,將其稱爲「MainTabelViewController」並在其中添加一個tableView。選擇內容動態原型樣式分組並創建1個原型單元格,併爲其添加一個UILabel以指定城市名稱。 「不要忘記把單元標識符名稱」。我把它叫做「cell」
  3. 將代表和數據源添加到類中並像代碼中那樣添加其功能。
  4. 從主視圖控制器到主表視圖控制器創建一個segue。並創建另一個相反的方向。「不要忘了把SEGUE標識符名稱」我打電話給他們「toCity」 & 「toMain」
  5. 創建「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.swiftUITextFields英寸我區分哪些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,我也只是添加了一個繼續按鈕。 enter image description here

enter image description here

+0

在什麼VC我應該加這 – Ahmed

+0

在表視圖VC去MainVC。只需添加一個全局變量,然後像在示例中那樣更改didSelectRowAt中的代碼,然後按照我在示例中所做的那樣編輯準備函數。 –

+0

確保將具有有效標識符名稱的storyVC從drawVC繪製到main storyboard上的mainVC。 –

0

如果你想原因請看MainVC,你應該從該類創建一個視圖控制器在SEGUE準備。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let passing = segue.destination as! ViewController 
    passing.passedCity2 = sender as! String 
} 

將ViewController更改爲任何您的類的名稱爲MainVC。

+0

那麼segue會不會到TableVC?因爲我想在那裏傳遞數據,並通過MainVC中的容器顯示它 – Ahmed

+0

在你的問題中,你說過你想要進入MainVC。你是什​​麼意思你想要顯示通過MainVC傳遞給TableVC的數據? –

+0

我刪除了我的答案,因爲它與@ David的 –

0

如果你想回去父視圖,你應該用一個展開-SEGUE。

有關必須在父視圖這樣

@IBAction func unwindSegueFromChild(segue: UIStoryboardSegue){ 
    // This code executes when returning to view 
} 

而在你的子視圖,你必須創建開卷SEGUE CTRL +拖動

enter image description here 似乎有一個下拉創造開卷SEGUE方法並且你選擇unwindSegueFromChild

一旦你完成了這個任務,你必須爲unwind segue指定一個標識符並以編程方式執行它,就像正常的segue一樣。

+0

我將代碼添加到MainVC並做了所有事情,如你所說,但它崩潰時,我選擇一排 – Ahmed

+0

你用來執行segue的代碼是什麼? –

+0

func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){0} {0}傳遞城市=城市2 [索引路徑。row] performSegue(withIdentifier:「show」,sender:self) – Ahmed