【问题标题】:TableView doesn't view valueTableView 不查看值
【发布时间】:2015-12-29 15:43:55
【问题描述】:

我在 ViewController 中有一个 TextField + Button + TableView。

项目运行,导入OK。但是我必须重新启动模拟器,TableView 现在显示值了。

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var myArray = [String]()

@IBOutlet weak var txtName: UITextField!

@IBAction func button(sender: AnyObject) {
    var delegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    var context: NSManagedObjectContext = delegate.managedObjectContext!

    var newName = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as! NSManagedObject
    newName.setValue(txtName.text, forKey: "name")
    context.save(nil)
    txtName.text = ""
}


@IBOutlet weak var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    var delegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    var context: NSManagedObjectContext = delegate.managedObjectContext!

    var export = NSFetchRequest(entityName: "Entity")
    export.returnsObjectsAsFaults = false

    var exportValue = context.executeFetchRequest(export, error: nil)

    for ketqua: AnyObject in exportValue! {

        myArray.insert((ketqua.valueForKey("name") as! String), atIndex: 0)

    }

    self.myTableView.delegate = self
    self.myTableView.dataSource = self

    self.myTableView.registerClass(myCell.self, forCellReuseIdentifier: "Cell")

    viewDidAppear(true)        
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    myTableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()       
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! myCell
    cell.textLabel?.text = myArray[indexPath.row]    

    return cell
}  

}

【问题讨论】:

  • 更新myArray并致电reloadData()
  • 独立于您的问题永远不要调用 viewDidAppear() - 以及所有其他委托方法 - 显式
  • @vadian 为什么会这样?
  • 委托方法由操作系统调用并符合特定顺序。目前该方法调用 super 可能会导致意外行为。

标签: ios swift uitableview xcode6


【解决方案1】:

问题是你应该在你的数据结构完成获取信息/数据之后调用reloadData(),在你的情况下是在将数据插入你的数组之后。

  override func viewDidLoad() {
        super.viewDidLoad() 
     myTableView.delegate = self  
      getMydata()     //<-- call the function here 

    }
     func  getMydata()
             {
               var delegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
               var context: NSManagedObjectContext = delegate.managedObjectContext!

                var export = NSFetchRequest(entityName: "Entity")
            export.returnsObjectsAsFaults = false

              var exportValue = context.executeFetchRequest(export, error: nil)
            for ketqua: AnyObject in exportValue!
             {
                myArray.insert((ketqua.valueForKey("name") as! String), atIndex: 0)
             }
              myTableView.reloadData()
        // and if you want use dispatch to get to main_queue again
    }

【讨论】:

  • 这会导致 {exportValue.count} 次调用 reloadData,从而经常不必要地重新加载表!
  • @Christian'fuzi'Orgler 我的编辑没有通过,这就是你否定帖子的原因和原因
  • 您发布的代码无效。您没有设置 dataSource ,这会导致有人尝试它并遇到另一个问题。你也经常不必要地调用 reloadData 。编辑你的问题,我很高兴推翻我的否定。 (也许你也这样做,因为我不明白为什么我的代码会失败?)
  • 嗨嗨嗨嗨。这不行.........我仍然必须为 TableView 重新启动模拟器......
【解决方案2】:

我稍微更改了您的代码,这应该适合您。正如 vadian 所说,您不应该自己调用 viewDidAppear()。

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var myArray = [String]()

private var delegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

@IBOutlet private weak var txtName: UITextField!
@IBOutlet private weak var myTableView: UITableView!

@IBAction func button(sender: AnyObject) {
    var context: NSManagedObjectContext = delegate.managedObjectContext!

    var newName = NSEntityDescription.insertNewObjectForEntityForName("Entity", inManagedObjectContext: context) as! NSManagedObject
    newName.setValue(txtName.text, forKey: "name")
    context.save(nil)
    txtName.text = ""
}

override func viewDidLoad() {
    super.viewDidLoad()

    var context: NSManagedObjectContext = delegate.managedObjectContext!

    var export = NSFetchRequest(entityName: "Entity")
    export.returnsObjectsAsFaults = false

    var exportValue = context.executeFetchRequest(export, error: nil)
    for ketqua: AnyObject in exportValue! {
        myArray.insert((ketqua.valueForKey("name") as! String), atIndex: 0)
    }

    self.myTableView.registerClass(myCell.self, forCellReuseIdentifier: "Cell")

    myTableView.delegate = self
    myTableView.dataSource = self

    myTableView.reloadData()       
}

// MARK: - UITableViewDataSource

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! myCell
    cell.textLabel?.text = myArray[indexPath.row]    

    return cell
}  
}

【讨论】:

  • 那么我认为您的设置有问题。您能对此发表更多见解吗?你如何呈现它,你的插座是否连接,一切都不是零,你的 UI 是如何设置的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多