gpt4 book ai didi

swift - 从 NSNotificationCenter 执行 reloadData() 后 UITableView 为空

转载 作者:行者123 更新时间:2023-11-30 14:18:01 26 4
gpt4 key购买 nike

我的 UITableView 有问题。它总是空的。

摘要:我有一个模特类。在我的 UITableViewController 中的 viewDidLoad 方法中实例化模型后,它将从我的服务器异步获取 JSON 结构。该数据将被解析为我的对象。

我的 UITableViewController 还有一个带有选择器方法的 NSNotification Observer。如果模型类发布通知(如果模型已完成从服务器请求和解析数据,则发布通知),将触发此选择器方法。

选择器方法将在调度主队列 block 中执行“self.tableView.reloadData()”。

调试器显示该对象不为 nil,但 tableView 为空。我不知道为什么桌面 View 是空的。

来 self 的 UITableViewController 的部分:

import UIKit

BillingPlanTableViewController 类:UITableViewController {

@IBOutlet weak var menuButton: UIBarButtonItem!
var budgetBillingPlansModel: BudgetBillingPlanModel!

// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()

//Menu gesture recognizer
if self.revealViewController() != nil {
menuButton.target = self.revealViewController()
menuButton.action = "revealToggle:"
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
}

//initialize BudgetBillingPlansModel
NSNotificationCenter.defaultCenter().addObserver(self, selector: "initBbPDone:",name:"initBbPDone", object: nil)
budgetBillingPlansModel = BudgetBillingPlanModel()
println(budgetBillingPlansModel)
}


// MARK: - Custom Methods
func initBbPDone(notification: NSNotification){
//reload tableview: from in thread: Zu diesem Zeitpunkt ist mein Objekt gefüllt.
dispatch_async(dispatch_get_main_queue(),{
self.tableView.reloadData()
});



}


// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

if(self.budgetBillingPlansModel.checkBbPisReady()){
return self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray().count
}else{
return 0
}

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if(self.budgetBillingPlansModel.checkBbPisReady()){
var numberOfRowsInSection: Int = 0

for(var index = 0; index < self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray().count; index++){
if(index == section){
numberOfRowsInSection = self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[index].getSubPlan().count
}
}

return numberOfRowsInSection
}else{
return 0
}

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("budgetBillingPlans", forIndexPath: indexPath) as! BudgetBillingPlanTableViewCell


if(self.budgetBillingPlansModel.checkBbPisReady()){
//section == bbP Array
for(var i = 0; i < self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray().count; i++){
if(i == indexPath.section){
//row == subPlans Array
let subPlans: [SubPlan] = self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getSubPlan()
for(var j = 0; j < subPlans.count; j++){
if(j == indexPath.row){
cell.ibo_header.text = "\(self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getSubPlan()[j].getSbbpDivisionName())"
cell.ibo_budgetAmount.text = "\(self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getSubPlan()[j].getSbbpActAmount())"
cell.ibo_contract.text = "\(self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getSubPlan()[j].getSbbpContractNumber())"
cell.ibo_date.text = (self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getFirstAdjustmentDate()) + " " + (self.budgetBillingPlansModel.getBudgetBillingPlanModel()!.getBbpArray()[i].getbbpCycleName())
}
}
}
}
}else{

}

return cell
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 150
}

}

我的模型类的零件:

class BudgetBillingPlanModel: NSObject {
var budgetBillingPlan: BudgetBillingPlan!
var bbPisReady: Bool!
//getBudgetBillingPlans
private func getBudgetBillingPlans(){
Alamofire.request(.GET, Constants.service_getBudgetBillingPlans)
.responseString { (request, response, jsonString, error) in
println(error)// error ist im debugger-Zeitpunkt == nil
self.budgetBillingPlan = self.parseServerResponse(jsonString!)
self.setbbPisReady()
}
}
//Notifications
private func setbbPisReady(){
self.bbPisReady = true
//object controller has to implement the notification method with "initBbPDone"
NSNotificationCenter.defaultCenter().postNotificationName("initBbPDone", object: nil)
}
//check status
func checkBbPisReady()->Bool{
if(self.bbPisReady == true){
return true
}else{
return false
}
}
//getter
func getBudgetBillingPlanModel()->BudgetBillingPlan?{
if(self.checkBbPisReady()){
return self.budgetBillingPlan
}else{
return nil
}
}

调试器屏幕截图:

enter image description here

添加:如果我尝试使用静态单元格初始化 tableView,它将显示静态单元格。但是在 viewDidLoad 实例化之后,当通知被触发时, TableView 是空的。如果我像平移或点击手势一样与空的 tableView 交互,我将收到错误:appdelegate 中的 EXC_bad_Access ( thread1 )

最佳答案

我没有发现 mvc 通信的通知模式的问题,但我认为这是线程的问题。解决方案是我切换到 kvc 模式,现在我的 tableView 不再是空的。

关于swift - 从 NSNotificationCenter 执行 reloadData() 后 UITableView 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com