2017-06-24 10 views
1

プロトタイプ細胞が表示されませんユーザーはビデオページを取得し、もう1つは、最初のビューから推定されたすべてのビデオリンクを表示して、ユーザーがページからどのビデオをキャストするかを選択させることです。私はリンクを得ることができますが、問題はそれがテーブルビューのセルに表示されたくないということです。私は多くのメソッドを試しましたが、何らかの理由でUITableViewDataSourceメソッドがまったく呼び出されていないことに気付きました。ここでは、コードは次のとおりです。のUITableViewは、今まで私はまだ2つのView Controllerを使用してビデオのリンクを表示しようとしていますまで、1が作るのWebViewが含まれている、私はテレビで動画を再生するにはCHROMECASTに接続アプリを作るしようとしています

ViewController.swift:

import UIKit 

class ViewController: UIViewController, UIWebViewDelegate { 
    //MARK: Outlets 
    @IBOutlet weak var searchBar: UITextField! 
    @IBOutlet weak var webView: UIWebView! 
    @IBOutlet weak var cancelButton: UIButton! 
    @IBOutlet weak var searchBarTrailingConstraint: NSLayoutConstraint! 

    //MARK: Properties 
    static var videoURLs: [String] = [] 

    //MARK: Methods 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     cancelButton.layer.cornerRadius = 5 
     cancelButton.isHidden = true 
     webView.delegate = self 

    } 

    func webViewDidFinishLoad(_ webView: UIWebView) { 
     var videoTag = "" 
     var embedTag = "" 
     let htmlCode = webView.stringByEvaluatingJavaScript(from: "document.documentElement.outerHTML") 
     let htmlTags = htmlCode!.components(separatedBy: "\n") as [String] 
     for tag in htmlTags{ 
      var videoURL = "" 
      if tag.contains("<video") { 
       videoTag = tag.substring(from: tag.range(of: "<video")!.lowerBound) 
       videoTag = videoTag.substring(to: (videoTag.range(of: ">")?.upperBound)!) 
       if videoTag.contains("src"){ 
        videoTag = tag.substring(from: tag.range(of: "src")!.upperBound) 
        for x in videoTag.characters{ 
         if x == "\""{ 
          continue 
         }else if x == "="{ 
          continue 
         }else if x == ">"{ 
          break 
         }else{ 
          videoURL.append(x) 
         } 
        } 
       } 
       ViewController.videoURLs.append(videoURL) 
      } 
      if tag.contains("<embed") { 
       embedTag = tag.substring(from: tag.range(of: "<embed")!.lowerBound) 
       embedTag = embedTag.substring(to: (embedTag.range(of: ">")?.upperBound)!) 
       if embedTag.contains("src"){ 
        embedTag = tag.substring(from: tag.range(of: "src")!.upperBound) 
        for x in embedTag.characters{ 
         if x == "\""{ 
          continue 
         }else if x == "="{ 
          continue 
         }else if x == ">"{ 
          break 
         }else{ 
          videoURL.append(x) 
         } 
        } 
       } 
       ViewController.videoURLs.append(videoURL) 
      } 
     } 
     NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "Done"))) 
    } 

    //MARK: Actions 
    @IBAction func cancelPressed() { 
     cancelButton.isHidden = true 
     searchBarTrailingConstraint.constant = 0.0 
     UIView.animate(withDuration: 0.25) { 
      self.view.layoutIfNeeded() 
     } 
     searchBar.resignFirstResponder() 
    } 

    @IBAction func searchBarPressed() { 
     searchBarTrailingConstraint.constant = (cancelButton.frame.width + 8.0) * -1 
     UIView.animate(withDuration: 0.25) { 
      self.view.layoutIfNeeded() 
     } 
     cancelButton.isHidden = false 
    } 

    @IBAction func returnButtonPressed(_ sender: UITextField) { 
     cancelPressed() 
     if let url = URL(string: sender.text!){ 
      if UIApplication.shared.canOpenURL(url){ 
       let request = URLRequest(url: url) 
       webView.loadRequest(request) 
      }else{ 
       let googleSearchURL = URL(string: "https://www.google.com/search?client=safari&q=\(url)&ie=UTF-8&oe=UTF-8") 
       let request = URLRequest(url: googleSearchURL!) 
       webView.loadRequest(request) 
      } 
     }else{ 
      var searchString: [String] = [] 
      var searchWord = "" 
      for x in (sender.text?.characters)!{ 
       if x == " "{ 
        searchString.append(searchWord) 
        searchWord = "" 
       }else{ 
        searchWord.append(x) 
       } 
      } 
      //For appending the last word not followed by a space 
      if !(searchString.last == searchWord){ 
       searchString.append(searchWord) 
      } 
      var googleSearchURL = "https://www.google.com/search?client=safari&ie=UTF-8&oe=UTF-8&q=" 
      for element in searchString{ 
       googleSearchURL.append(element) 
       if !(searchString.last == element){ 
        googleSearchURL.append("+") 
       } 

      } 
      let request = URLRequest(url: URL(string:googleSearchURL)!) 
      webView.loadRequest(request) 
     } 
    } 

    @IBAction func backButtonPressed(_ sender: UIButton) { 
     if webView.canGoBack{ 
      webView.goBack() 
     } 
    } 

    @IBAction func forwardButtonPressed(_ sender: UIButton) { 
     if webView.canGoForward { 
      webView.goForward() 
     } 
    } 

} 

MediaTableViewController:

import UIKit 
import AVFoundation 

class MediaTableViewController: UIViewController, UITableViewDataSource { 

    var videoURLs: [String] = [] 
    var videoScreenshots: UIImage! 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(self, selector: #selector(MediaTableViewController.replyToNotification), name: nil, object: nil) 

     self.tableView.dataSource = self 

    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     print("NOW!\n\n\n", indexPath.count) 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! MediaTableViewCell 

     cell.videoImage.image = videoScreenshot(url: videoURLs[indexPath.count]) 
     cell.videoURL.text = videoURLs[indexPath.count] 

     return cell 
    } 

    @objc func replyToNotification(){ 
     videoURLs = ViewController.videoURLs 
     ViewController.videoURLs = [] 
    } 

    // MARK: - Table view data source 

    func videoScreenshot(url: String) -> UIImage? { 

     let asset = AVURLAsset(url: URL(string: url)!) 
     let generator = AVAssetImageGenerator(asset: asset) 
     generator.appliesPreferredTrackTransform = true 

     do { 
      let imageRef = try generator.copyCGImage(at: CMTime(value: asset.duration.value/2, timescale: asset.duration.timescale), actualTime: nil) 
      return UIImage(cgImage: imageRef) 
     } 
     catch let error as NSError 
     { 
      print("Image generation failed with error \(error)") 
      return nil 
     } 
    } 

} 

MediaTableViewCell.swift:ここ

import UIKit 

class MediaTableViewCell: UITableViewCell { 

    @IBOutlet weak var videoImage: UIImageView! 
    @IBOutlet weak var videoURL: UITextView! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

} 

がMain.storyboardです:

main.storyboard

答えて

2

あなたはのtableViewがアイドル状態であるため、reloadData()を呼び出すことはありません。

は修正するには、この次 MediaTableViewControllerに:私はあなたがのtableViewデリゲートを実装していませんでした見たよう

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(MediaTableViewController.replyToNotification), name: nil, object: nil) 
    self.tableView.delegate = self 
    self.tableView.dataSource = self 

} 

は、あなたのコントローラに、このメソッドを追加

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    tableView.reloadData() 
} 
+0

修正していない、まだ何も表示されていない – user3407319

+1

これは別の問題です。元の問題は、 "UITableViewDataSourceメソッドがまったく呼び出されていない"ということでした。これはこのソリューションを使用して修正する必要があります。ご確認ください。 'dataSouce'メソッドが呼び出され、' tableView'にエントリがない場合、 'MediaTableViewController videoURLs.count'はおそらくゼロです。ここでは、 'MediaTableViewController videoURLs'をどこにどのように設定/追加するかを示します。 – shallowThought

+0

私はメソッドが呼び出されているとは思わない、今!テーブルビューメソッド – user3407319

0

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

これが助けてくれることを願って。

+0

1つのセクションがデフォルトです。 – shallowThought

関連する問題