2017-06-27 13 views
1

私はtableViewと2番目のViewControllerを作るために3つの配列を持っています。 1つは、各セクションのヘッダーをtableViewに表示し、1つはタイトルを表示し、1つは各セルのリンクを表示します。私が構築し、セルの一つをタップすると、私が得る:Swift - prepareForSegueが動作しない

let url = URL(string: websiteURL)! 

は今、私は私のprepareForSegueが機能していないので、これがあると信じて、それは送らないです意味:この行の

fatal error: unexpectedly found nil while unwrapping an Optional value

配列データを介して2番目のView Controller(ChannelViewController)に渡します。 は、私はまた、prepareForSegue機能に

print("hello") 

を追加し、「こんにちは」、デバッガに表示されている場合見て、によってこれをテストしました。しかし、それはしませんでした。

私は主な問題は、prepareForSegueを行うことを想定していると推測しています。ここで

はFirstViewControllerコードです:ここで

import UIKit 




class FirstViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 



var headers = ["Bein Sports", "Sky Sports", "Alkass", "Other"] 

var channels = [["Bein Sports 1","Bein Sports 2","Bein Sports 3","Bein Sports 4","Bein Sports 5","Bein Sports 6","Bein Sports 7","Bein Sports 8","Bein Sports 9","Bein Sports 10","Bein Sports News"], 
          ["Sky Sports 1","Sky Sports 2","Sky Sports 3","Sky Sports 4","Sky Sports 5"], 
          ["Alkass One", "Alkass Two", "Alkass Three", "Alkass Four", "Alkass Five"], 
          ["BT Sports 1", "BT Sports 2", "Real Madrid TV", "Real Madrid TV 2"]] 

var links = [["https://www.google.ca","https://www.facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com"], 
      ["https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com"], 
      ["https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com","https://facebook.com"], 
      ["http://twitter.com","http://facebook.com","http://www.google.com","http://www.instagram.com"]] 

var myIndex : IndexPath = IndexPath() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

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

func numberOfSections(in tableView: UITableView) -> Int { 
    return channels.count //Rows 
} 

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return headers[section] //Sections 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = channels[indexPath.section][indexPath.row] //TextLabel 
    return cell 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    myIndex = IndexPath(row: indexPath.section, section: indexPath.row) 
    performSegue(withIdentifier: "segue", sender: self) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier == "segue") { 
     let viewController = segue.destination as! ChannelViewController 
     // Now you have a pointer to the child view controller. 
     // You can save the reference to it, or pass data to it. 
     viewController.websiteURL = links[myIndex.section][myIndex.row] 
     print("google") 
    } 
} 
} 

が第二ビューコントローラのコードです:

import UIKit 
import WebKit 
import AVKit 
import AVFoundation 

class ChannelViewController: UIViewController { 


    var webView: WKWebView! 
    var websiteURL = "" 



override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 



    webView = WKWebView() 
    webView.scrollView.isScrollEnabled = false 


    view.addSubview(webView) 
    let url = URL(string: websiteURL)! 
    let req:URLRequest = URLRequest(url: url) 
    webView.load(req) 

    webView.translatesAutoresizingMaskIntoConstraints = false 
    let width = NSLayoutConstraint(item: webView, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 1.0, constant: 0) //Constraints 

    let height = NSLayoutConstraint(item: webView, attribute: .height, relatedBy: .equal, toItem: view, attribute: .height, multiplier: 1.0, constant: 0) 
    view.addConstraints([width,height]) //Constraints 

} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
+0

'FUNC prepareForSegueを交換してそれを呼び出して使用する必要がありますUIStoryboardSegueを、 Swift 3を使用しているようだからです。https://stackoverflow.com/questions/40491818/didselectrowatindexpath-not-working-swift-3 – Larme

+0

これとは別に、 'url'はクラッシュするように要求しています。条件付きアンラップを使用して適切なメッセージを表示してください – Paulw11

答えて

3

あなたはセグエの準備を使用している方法が正しくありません。セグエのために(funcが用意 `と`(ANYOBJECT:UIStoryboardSegue、送信者?セグエ):

あなたは

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

もが

self.performSegue(withIdentifier: "segue", sender: nil) 
+0

'prepare(for:sender:)'のシグネチャを修正することで問題が解決されます。 'sender'を' nil'に設定しても差はありません。実際には '送付者'はおそらく 'indexPath'であるべきですし、' myIndex'でダンス全体を避けることができます – Paulw11

+0

ああ。送信者のものに同意します。私は一般的な言葉としてそれを書いていませんでした。私の悪い。 – Behrad3d

+0

問題ありません。それは自分よりも尋問者に対するコメントだった。 – Paulw11

関連する問題