Swift UITableView不显示原型单元格
我正在尝试制作一个连接到chromecast的应用程序,以便在电视上播放视频,到目前为止,我仍在尝试使用两个视图控制器显示视频链接,其中一个包含一个webview,使用户可以获得视频页面,另一个是显示从第一个视图推断出的所有视频链接,以便用户从页面中选择要播放的视频。我能够获得链接,但问题是它不希望显示在表视图单元格中。我尝试了许多方法,但我注意到,出于某种原因,根本没有调用UITableViewDataSource方法。代码如下: ViewController.swift:Swift UITableView不显示原型单元格,swift,uitableview,storyboard,Swift,Uitableview,Storyboard,我正在尝试制作一个连接到chromecast的应用程序,以便在电视上播放视频,到目前为止,我仍在尝试使用两个视图控制器显示视频链接,其中一个包含一个webview,使用户可以获得视频页面,另一个是显示从第一个视图推断出的所有视频链接,以便用户从页面中选择要播放的视频。我能够获得链接,但问题是它不希望显示在表视图单元格中。我尝试了许多方法,但我注意到,出于某种原因,根本没有调用UITableViewDataSource方法。代码如下: ViewController.swift: import UI
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()
}
}
}
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:
您不调用
reloadData()
,因此tableView处于空闲状态
要解决此问题,请将以下内容添加到MediaTableViewController
:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.reloadData()
}
正如我看到的,您没有实现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
}
然后将此方法添加到控制器中
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
希望这会有帮助没有解决它,仍然没有出现任何问题这是另一个问题。最初的问题是“根本没有调用UITableViewDataSource方法”。应使用此解决方案修复此问题。请确认。如果调用了
dataSouce
方法,并且在tableView
中没有得到任何条目,MediaTableViewController videourl.count
很可能为零。在本例中,显示您在何处以及如何设置/添加MediaTableViewController视频URL
。我不认为正在调用这些方法,现在!未在tableview方法中打印在numberOfRowsInSection
中设置断点。它被称为<代码>现在未打印代码>,因为MediaTableViewController videoURLs.count
为零(如写入的那样),因此从不调用cellForRowAt indexPath
。是。您必须随通知一起发送一个userInfo
字典,其中包含视频URL
。我建议不要在这里使用通知。您应该只对多个广播使用通知。默认为一个部分。
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}