如何使用故事板设计更多共享tableview的视图

时间:2015-08-20 20:52:05

标签: ios swift uitableview storyboard

我想有多个视图,每个视图包含2个tableview(每个视图占半屏)。其中一个表视图将由每个视图共享。表格视图的行为或多或少是独立的。

我想到了两个选择:

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

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

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

我试图按照Andriy Gordiychuk(答案1)的建议去做,但我认为我搞砸了......:
当我运行应用程序时,它会成功构建,但每当我尝试使用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数据库(我已经测试过)中加载单元格的内容。

有什么建议吗? 谢谢,
小号

1 个答案:

答案 0 :(得分:0)

创建一个类,它将成为共享表视图的数据源/委托:

class SharedReusableTableViewDelegate:UITableViewDelegate,UITableViewDataSource {

    //put below all the delegate/data source functions

}

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

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

就是这样。

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

我认为这就是你想要实现的目标。如果没有,请您澄清一下您想要达到的目标?