如何使用 Storyboard 设计更多共享一个 tableview 的视图

How to design more views sharing a tableview using the storyboard

我想要多个视图,每个视图包含 2 个表格视图(每个视图占半个屏幕)。其中一个表视图将由每个视图共享。表格视图或多或少会独立运行。

我想到了两个方案:

1) 独立视图,只要视图到位就会重新加载共享表视图。

2) 每个视图共享一个单独的表格视图(类似于拆分视图控制器中发生的情况(尽管我不能使用拆分视图,因为我想在设备处于纵向模式时使用自适应布局)。

我感觉第二种方法最好,但我想不出一种方法来设计它。 获得这个的最好方法是什么?

我已尝试按照 Andriy Gordiychuk(答案 1)的建议进行操作,但我认为我把事情搞砸了....:[=​​32=] 当我 运行 应用程序时,它构建成功,但每当我尝试访问共享视图并出现 EXC_BAD_ACCESS 错误时它就会崩溃。

这是 SharedReusableTableViewDelegate:

class SharedReusableTableViewDelegate: UIViewController, UITableViewDelegate, UITableViewDataSource {

var databasePath = String()
var selectedVerse : Int = 1

func registerClass(UITableViewCell, forCellReuseIdentifier identifier: String){}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let row : Int = indexPath.row
    var getVerse = DatabaseDB()
    var verse = DatabaseVars()
    (verse.book, verse.chapter, verse.verseNumber, verse.extra, verse.verseText) = getVerse.getVerseBy(row, database: databasePath as String)
    let cell: AnyObject = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
    cell.textLabel?!.text = "\(verse.chapter),\(verse.verseNumber) \(verse.verseText)"
    return cell as! UITableViewCell
}

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let numberofCells = 200
    return numberofCells
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        selectedVerse = indexPath.row + 1
        println("You selected cell #\(selectedVerse)!")
}

}

这里是 Table1 视图的控制器:

class Table1: UIViewController {

@IBOutlet weak var verseView: UITableView!
var databasePath = NSString()
var currentPath = NSString()

override func viewDidLoad() {
    super.viewDidLoad()

    let filemgr = NSFileManager.defaultManager()
    let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let docsDir = dirPaths[0] as! String
    databasePath = docsDir.stringByAppendingPathComponent("LuceDaLuce.db")
    var fileCopyError : NSError? = NSError()
    currentPath = NSBundle.mainBundle().pathForResource("tmp", ofType: "db")!
    println("currentPath: \(currentPath)")
    if !filemgr.fileExistsAtPath(databasePath as String) {
        if filemgr.copyItemAtPath(currentPath as String, toPath: databasePath as String, error: &fileCopyError) {
            println("Copy successful")
        } else {
            println("Copy failed with error: \(fileCopyError!.localizedDescription)")
        }
    } else {println("The database is already there")}

    let delegate = SharedReusableTableViewDelegate()
    delegate.databasePath = databasePath as String
    verseView.delegate = delegate
    verseView.dataSource = delegate
}
}

我正在从 sqlite 数据库(我已经测试过)加载单元格的内容。

有什么建议吗?
谢谢,
S

创建一个 class,这将是您共享的 table 视图的数据 source/delegate:

class SharedReusableTableViewDelegate:UITableViewDelegate,UITableViewDataSource {

    //put below all the delegate/data source functions

}

您现在要做的就是在您拥有它们的视图控制器中为您的 table 创建 IBOutlet,然后在 viewDidLoad 中添加以下内容:

let delegate = SharedReusableTableViewDelegate()
mySharedTableView.delegate = delegate
mySharedTableView.dataSource = delegate

就是这样。

通过此设置,您可以将填充 table 的逻辑与绘制它们的逻辑分开。您必须为每个视图控制器场景创建 UI 设计,然后只需为每个重用的 table 视图分配正确的委托即可。该委托将所有代码包含在一个文件中。

我认为这就是您想要实现的目标。如果没有,能否说明一下您到底想达到什么目的?