私はこれにかなり新しいです。私はこのトピックに関するさまざまな質問を検討するために数時間を費やしましたが、私の質問に合う答えを見つけることができませんでした。
サブビューとしてtableviewを使用する(tableviewcontrollerではなく)viewcontrollerがあります。私の質問は、ビューコントローラーの:viewwillappearメソッド内でテーブルデータをリロードする方法です。メソッド内では、tableviewインスタンスに「アクセス」できません。 (私は私がtableviewcontrollerを使用していないのでreloaddata()を使用できないことも理解しています)。
簡単な解決策を知っていますか? (私はプロトコルがここで役立つと非常に思いますか?)
これは要するにコードです:
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
var Person_data = [Person]()
override func viewDidLoad() {
super.viewDidLoad()
let tb: UITableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
tb.dataSource = self
tb.delegate = self
super.view.addSubview(tb)
fetch_data()
}
func tableView(tableview: UITableView, numberOfRowsInSection section: Int) -> Int {
let rows = Person_data.count
return rows
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell: UITableViewCell = UITableViewCell()
cell.textLabel?.text = Person_data[indexPath.row].name
return cell
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
fetch_data()
// reload at this point
}
func fetch_data() {
let tb_fetchRequest = NSFetchRequest(entityName: "Person")
do {
let tb_fetchResults = try my_moc.executeFetchRequest(tb_fetchRequest) as? [Person]
Person_data = tb_fetchResults!
} catch let error as NSError {
print("request error: \(error)")
}
}
}
あなたの問題は、tb
がローカル変数であるため、viewDidLoad()
の外からは見えないということです。
tb
をビューコントローラーのプロパティ(a.k.a.インスタンス変数)にすると、コントローラーのどのメソッドからでも使用できます。
_class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
var Person_data = [Person]()
private var tb: UITableView? // Now the scope of tb is all of ViewController3...
override func viewDidLoad() {
super.viewDidLoad()
// ...so it is visible here...
tb = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
...
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
fetch_data()
tb?.reloadData() // ...and it is also visible here.
}
_
コードでは、tb
がローカル変数であるということは、viewDidLoad()
が終了したときにUITableView
オブジェクトが消えることを意味するわけではありません。それは、あなたのreferenceへのUITableView
が消えたことを意味します。テーブルビューオブジェクト自体は、ビュー階層に追加されているため存続しますが、変数がスコープ外になったため、参照できなくなりました。
変数とそれらが参照するオブジェクトの違いについてさらに読むには、「スコープ」と「参照渡し」を検索してください。
tableView
IBOutlet
にはviewWillAppear:
でアクセスできます。reloadData
を呼び出すこともできます。なぜできないと思うのかはわかりませんが、問題なく機能するはずです。
TableViewへのリンクを持つ変数を作成し、viewWillAppearの前に作成する必要があります。
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
var Person_data = [Person]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
super.view.addSubview(tb)
fetch_data()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
fetch_data()
tableView.reloadData()
}
}
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
var Person_data = [Person]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
super.view.addSubview(tb)
fetch_data()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
fetch_data()
tableView.reloadData()
}
}