2016-11-28 61 views
0

我是Swift新手(我使用2.0),並沒有任何編程經驗。所以,我是新手)試圖做一些相當簡單的事情。鏈接一個UITableViewCell點擊呼叫不同的ViewController。這就像用戶點擊單元車並打開新的ViewController鏈接一個單元格來調用不同的ViewController

我已經創建了ViewControllers (storyboard A,B,C,D,E)。 我如何連接?如果我正確理解我應該使用didSelectRowAtIndexPath。我曾問過

代碼:

import UIKit 

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 


let list = ["Cars", "Fruits", "Foods", "Toys"] 
let listdesc = ["Toyota", "Apple", "Meat", "Fallout 4"] 
let identities = ["A", "B", "C", "D"] 

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellIdentifier: String = "cell" 

    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: cellIdentifier) 

    cell.textLabel?.text = list[indexPath.row] 
    cell.detailTextLabel?.text = listdesc[indexPath.row] 

    return cell 

} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    } 

回答

0

你應該有這樣做的didSelectRowForIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     let StoryBoard = UIStoryboard(name: "Main", bundle: nil) 

     if(list[indexPath.row] == "Cars") { 
     var vcA = STORYBOARD.instantiateViewControllerWithIdentifier("A") as! A 
     self.navigationController?.pushViewController(vcA, animated: true) 
     } else if(list[indexPath.row] == "Fruits") { 
      var vcB = STORYBOARD.instantiateViewControllerWithIdentifier("B") as! B 
      self.navigationController?.pushViewController(vcB, animated: true) 
     } 

    } 

和其他條件,你將管理如我....

+0

的,他應該設置'stoaryboard identifier'!你應該在回答中提到! – Lion

+0

是的..他必須設置標識符... –

+0

謝謝大家,我真的很感激。 as有2個嚴重錯誤! A和! B - >使用未聲明的類型「A」和「B」。請檢查我的故事板 - https://postimg.org/image/altu24893/ – JonnyA

0

由Gaurav回答,您可以檢查didSelectRowAtIndexPath哪個indexPath被選中,然後導航到相應的控制器。

但是,如果您使用的是不同的故事板,那麼self.storyboard而不是STORYBOARD可能會派上用場。

也從var更改您的viewController的對象,讓你不改變它們,所以他們應該是常量。

而最後一個「總是避免力量解開」,而是自己處理錯誤。

0

你必須準備數據像這樣和

options = [ 
     { 
     "category":"Cars" 
     "subcat":"Cars" 
     "viewType":"A" 
     }, 
    { 
     "category":"Fruits" 
     "subcat":"Apple" 
     "viewType":"B" 
     },{ 
     "category":"Foods" 
     "subcat":"Meat" 
     "viewType":"C" 
     } 
    ] 

這不完全粘貼複製的回答對你的東西,但你需要創建一個類似數據的數據。 您需要將數據全部修改到一起,以便使用單個字典對象中的特定索引,您將一次獲得所有數據。如果你的數組沒有正確的數據,那麼你的應用程序可能會崩潰,如果索引將不適當。

然後,對於特定的索引,你可以得到viewType。你可以將它與需要的類型進行比較,並獲取viewcontroller引用並推送它。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     if(options[indexPath.row]["viewType"] == "A") { 
     // Get A controller reference and use it 
     }else if(options[indexPath.row]["viewType"] == "B") { 
     // Get A controller reference and use it 
     }else if(options[indexPath.row]["viewType"] == "C") { 
     // Get A controller reference and use it 
     } 
    } 

我希望你能理解結構。請讓我知道你是否不清楚。

更新時間: 從故事板獲得參考,

let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil) 
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController") as! UIViewController 
self.present(controller, animated: true, completion: nil) 
+0

謝謝,它非常清楚。但是,我如何才能「獲取控制器參考並使用它」?我真的很新。 – JonnyA

+0

我已經添加了幾行只是檢查。 – Sandy

0

試試這個。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 


     // If storyboard name is A.storyboard. 
     let storyboard = UIStoryboard(name: "A", bundle: nil) 
     let vc = storyboard.instantiateViewControllerWithIdentifier("nextViewControllerId") as! nextViewController // The `nextViewController` storyboardId is supposed as "nextViewControllerId" 
     self.presentViewController(vc, animated: true) 
    } 

每次單擊任何單元格時,都會顯示nextViewController。如果你想讓特定的單元格打開不同的viewcontroller,使用你在這個函數中使用條件的邏輯。

0

1.從TableViewController Scene創建一個segue到其他 ViewControllerScene。

2.給每個場景賦予唯一的標識符。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    //Based on your condition. 
    //Initiates the segue with the specified identifier from the current view controller's storyboard file. 
    performSegue(withIdentifier: "segueA", sender: self) 
} 
0

如果您有三個故事板,如Main,PreLogin和PostLogin。然後,你首先要聲明的所有故事板是這樣的: -

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let preLoginStoryboard = UIStoryboard(name: "PreLogin", bundle: nil) 
let postLoginStoryboard = UIStoryboard(name: "PostLogin", bundle: nil) 

您從didSelectRowAtIndexPath方法方法一樣,調用不同的viewController:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    switch indexPath.row{ 
     case 0: 
      let firstViewControllerScene = mainStoryboard.instantiateViewControllerWithIdentifier("firstViewControllerId") as! FirstViewController 
      self.presentViewController(firstViewControllerScene, animated: true) 

     case 1: 
      let secondViewControllerScene = preLoginStoryboard.instantiateViewControllerWithIdentifier("secondViewControllerId") as! SecondViewController 
      self.presentViewController(secondViewControllerScene, animated: true) 

     case 2: 
      let thirdViewControllerScene = postLoginStoryboard.instantiateViewControllerWithIdentifier("thirdViewControllerId") as! ThirdViewController 
      self.presentViewController(thirdViewControllerScene, animated: true) 

     default: 
      break 
     }  
} 
相關問題