、これを試してみてください代わりの解決法を提案する。これはmacOSですが、iOSとよく似ており、別のオプションを提供するだけです。
tableViewがあり、ユーザーが選択した内容に応じてtableViewに表示されているものを切り替えるとします。
は2つのレルムを与えるRedGrape、WhiteGrape
オブジェクト、その後、ブドウと呼ばれるこれらの両方のリストを含むクラス。これは元の質問に似ていますが、リストで使用するために、より明確に定義された項目を使用したかったのです。
class RedGrape: Object {
@objc dynamic var grapeName = ""
}
class WhiteGrape: Object {
@objc dynamic var grapeName = ""
}
class Grape: Object {
let reds = List<RedGrape>()
let whites = List<WhiteGrape>()
}
、その後のViewController内のtableViewを処理するクラスは、この点に注意してくださいは単なる概念である:
class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
@IBOutlet weak var myTableView: NSTableView!
var self.userSelection = 0 //changed by user: 0 for red, 1 for white
var myGrape = //set up the Grape Object var from Realm
override func viewDidLoad() {
super.viewDidLoad()
self.userSelection = 0
self.myTableView.delegate = self
self.myTableView.dataSource = self
self.myTableView.reloadData()
}
func numberOfRows(in tableView: NSTableView) -> Int {
if self.userSelection == 0 {
return self.myGrape.reds.count
} else {
return self.myGrape.white.count
}
}
func tableView(_ tableView: NSTableView,
viewFor tableColumn: NSTableColumn?,
row: Int) -> NSView? {
var name = ""
if self.userSelection == 0 {
name = self.myGrape.reds[row].grapeName
} else {
name = self.myGrape.whites[row].grapeName
}
let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue:"MyCellView")
if let cellView = self.myTableView.makeView(withIdentifier: cellIdentifier,
owner: nil) as? NSTableCellView {
cellView.textField?.stringValue = name
return cellView
}
return nil
}
}
ここからは、ブドウのクラス内でより多くの意思決定のコードを実装することができます:
class Grape: Object {
let reds = List<RedGrape>()
let whites = List<WhiteGrape>()
func rowCountFor(selection: Int) -> Int {
if selection == 0 {
return self.Grape.reds.count
} else {
return self.Grape.white.count
}
func nameFor(selection: Int, forRow: Int) -> String {
if selection == 0 {
return self.reds[forRow]
} else {
return self.whites[forRow]
}
}
}
あなたのtableView numberOfRowsは
になります。
func numberOfRows(in tableView: NSTableView) -> Int {
self.myGrape.rowCountFor(selection: self.userSelection)
}
正確に何をしようとしているのかは少しはっきりしていますが、デザインを再検討したいことがあります。つまり、 'メイン' RealmModelには、Realmオブジェクトの2つのリストがあり、同時にアクセス可能であり、同時に2つの配列の1つを返す関数もあります。本質的に機能を重複します。レルムからRealmModelオブジェクトを取得したら、配列に直接アクセスできます。 someArray = aRealmModel.arrayList1とします。そのため、arrayList1またはarrayList2をtableViewデータソースとして使用できます。なぜ /汎用タイプを使用したいのかを明確にすることはできますか? –
Jay
アイデアは私のコードを複製したくないということです!、今はあなたが言及したとおりに正確に私のコードを複製します! 両方のリストが同じTableviewに表示されるので、ユーザーが使用するアクションに応じて切り替える必要があります。なぜ、正しいコンテンツを表示できるように最初にチェックする必要があるのですか。 私はこのようにする必要があるのは明らかだと思います。 – X901
私はそれが正当なものだと思っていたからといってジェネリックタイプを使用しました。 – X901