【问题标题】:Adding two Table Views to the main View in Xcode在 Xcode 的主视图中添加两个表视图
【发布时间】:2014-07-29 15:28:41
【问题描述】:

我在 main.storyboard 上放置了两个 Table View。然后我为它们创建了两个新的 .swift 类文件:VideoTableViewController 和 LinkTableViewController。我如何将两者联系起来?看起来我可能做错了,因为我读到我需要将委托链接到表视图所在的视图。我希望它链接到我为表视图创建的控制器。 我想要做的是并排有两个列表,一个带有视频链接,另一个带有网络链接。我已经有了数组中的数据。我只需要将这些数据放入适当的表格视图的单元格中。

我注意到我可以将 Table View Controller 拖放到情节提要上,但我不这么认为 是我想要的,因为这是一个完全不同的观点。我希望这些观点保持一致。

VideoTableViewController:

import Foundation
import UIKit

class VideoTableViewController: UITableViewController {
@IBOutlet weak var videoTable = UITableView()

var videos: [Video] = []

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!  {

    //disable header
    tableView.contentInset = UIEdgeInsetsMake(-30, 0, -20, 0);

    var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Component") as UITableViewCell

    if (cell == nil) {
        cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Component")
    }

    //cell.textLabel.text = "Baking Soda"
    //cell.detailTextLabel.text = "1/2 cup"

    return cell
}

override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
    return 1
}

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

}

override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    return self.videos.count
}

func setVideos(videos:[Video]) {
    self.videos = videos
}
}

主视图控制器:

这会填充对象数组,然后将数组传递给适当的表控制器。

import UIKit

class ViewController: UIViewController {

//arrays to hold objects
var videos  :[Video] = []
var links   :[Link] = []

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

    self.fillArrays()

    //instantiate TableViewController
    let videoTable = VideoTableViewController()
    let linkTable = LinkTableViewController()
    videoTable.setVideos(videos)
    linkTable.setLinks(links)
}

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

func fillArrays() {
    let file = File()
    let path = "/Users/me/file.rtf"

    if (file.exists(path)) {                                        //if file exists
        let read :String? = file.read(path)                         //read the file
        let content :String = read!                                 //get file content
        let lines = content.componentsSeparatedByString("\n")       //explode content on line breaks

        var lineItem :[String]                                      //to hold each item of line explode
        for line in lines {                                         //loop through lines
            lineItem = line.componentsSeparatedByString(",")        //explode line on commas

            //instantiate an object for the line, initialize it, and append the object to its array
            switch lineItem[0] {
            case "L":
                self.links += Link(image: lineItem[0], path: lineItem[1])
            case "V":
                var duration :Int = 100
                self.videos += Video(image: lineItem[1], path: lineItem[2], title: lineItem[3], duration: duration)
            default:
                break
            }
        }
    }
}
}

那么,我是不是搞错了?显然这是我正在做的一件奇怪的事情,因为我在谷歌上找不到太多直接的信息。

【问题讨论】:

  • 通常您希望选择 MVC 风格的应用程序,其中视图控制器处理为其视图提供数据:developer.apple.com/library/ios/documentation/general/…。话虽如此,如果您尝试将表视图连接到特定类,则可以在界面生成器中更改它们的类。
  • 你是说你只想要一个视图控制器来管理 2 个表视图?

标签: ios xcode uitableview swift


【解决方案1】:

如果您想在同一个视图控制器中使用 2 个表视图,请执行以下操作:

  1. 创建一个 UIViewController 作为代理

    UITableViewDelegate, UITableViewDataSource
    
  2. 在情节提要的视图控制器中添加 2 个 uitableviews
  3. 在 ViewController.h 文件中为 UITableView 添加 2 个 IBOutlets,如下所示:

    @property (nonatomic, weak) IBOutlet UITableView *tableView1;
    @property (nonatomic, weak) IBOutlet UITableView *tableView2;
    
  4. 将 IBOutlets 连接到这些。

  5. 在 .m 文件中为 tableview 添加委托函数,如下所示:

     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     {
        // Return the number of rows in the section.
        if(tableView == self.tableView1){
            return whatever1;
        }
    
        if(tableView == self.tableView2){
            return whatever2;
        }
     }
    

【讨论】:

  • 我想我只是没有关注。如果我创建一个 UIViewController 那么我是否不必将控制器从右下角的那个框拖到情节提要上?我可以用表格视图来做到这一点,但我不能把那个表格视图控制器放到默认的视图控制器上。我将在屏幕左侧打开一些标签的东西,在所选时会弹出表视图。但是,我仍然不知道如何做这样的事情,因为我不希望表格视图使用整个屏幕的空间。无论如何,非常感谢!
  • 我建议你拖出一个ViewController,然后在里面放2个Tableview。您可以从左侧选项卡访问它们。而且它们不必是全屏的。抱歉,我无法理解问题所在。
  • @hackerinheels,兄弟你能帮我解决我的问题吗stackoverflow.com/questions/43757311/…
【解决方案2】:

@hackerinheels 提出的解决方案在一些不同的设置中对我有用:在视图控制器中使用 UITableView,如单选按钮组。它最初不起作用,因为我错过了在 View Controller 的 viewDidLoad() 中连接委托和数据源的这一步:

tableView.delegate = self
tableView.dataSource = self

添加此步骤后,它开始运行良好。

虽然这对于有经验的人来说可能是轻而易举的事,但对于像我这样的外行来说,把它拼出来会很有帮助。

对于一个 View Controller 中的 2 个 TableView 的解决方案,@hackerinheels 提出的 5 个步骤 + 上面对 viewDidLoad() 的更改,效果很好!

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多