我想有多个视图,每个视图包含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数据库(我已经测试过)中加载单元格的内容。
有什么建议吗?
谢谢,
小号
答案 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设计,然后您只需为每个重用的表视图分配正确的委托。该委托包含一个文件中的所有代码。
我认为这就是你想要实现的目标。如果没有,请您澄清一下您想要达到的目标?