我有一个UIViewController,当用户单击按钮时,我想显示UITableView。我从服务器接收数据。
问题是发生了一些奇怪的事情。有时,并不是所有的单元格都会更新。换句话说,在我的原型单元格中,有两个带有默认文本的按钮,但是当我从服务器加载数据时,并不是所有的按钮文本都会更新,而是当我滚动表时,它们会更新。另外,当我**滚动*表格时,有时按钮会返回到默认文本。
这是我的代码:(非常简单)
class CusinePreferencesTableView: NSObject, UITableViewDelegate, UITableViewDataSource {
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentefiers.oneCusinePreferencesCell.rawValue, forIndexPath: indexPath) as! OneCusinePreferencesTableViewCell
var row = indexPath.row
print("row = \(row)")
let oneCusineDataLeft = Preferences2ViewController.cusines![row]
cell.leftButton.titleLabel?.text = oneCusineDataLeft
row = row + 1
if row < Preferences2ViewController.cusines!.count{
let oneCusineDataRight = Preferences2ViewController.cusines![row]
cell.rightButton.titleLabel?.text = oneCusineDataRight
}else {
//I should hide the right button
}
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let cusines = Preferences2ViewController.cusines {
if cusines.count % 2 == 0 {
return cusines.count/2
}else {
var count = cusines.count/2
count = count + 1
return count
}
}else {
return 0
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
}
这是表格视图(如果你想要的话)
如果你看不到我的问题描述,我可以给你做一个视频
更新1
我已经调用了reloadData,正如您在这里看到的(从服务器获取数据)
func loadCusiens(){
let url = NSURL(string: ConstantData.getWebserviceFullAddress()+"preferences/cusines")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error ) in
if let error = error {
print("error = \(error)")
}
if let data = data {
do{
let jsonArray = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! NSArray
var results = [String]()
for oneJSON in jsonArray {
let name = oneJSON["name"] as! String
results.append(name)
}
dispatch_async(dispatch_get_main_queue(), {
Preferences2ViewController.cusines = results
self.cusineTableView.reloadData()
})
} catch{
print("This exception happened = \(error)")
}
}
})
task.resume()
}
更新
现在在else部分,我将右边按钮的文本设置为“sometext”
这是一个关于这个问题的视频
http://www.mediafire.com/watch/k2113ovebdvj46d/IMG_0911.MOV
最佳答案
更新
主要的问题不是单元重用,也不是我下面解释的布局问题,而是使用:
cell.leftButton.titleLabel?.text = oneCusineDataLeft
设置按钮文本。您必须使用:
cell.leftButton.setTitle(oneCusineDataLeft, forState: .Normal)
相反。(本质上,a
UIButton
会跟踪处于不同“状态”(正常、选定等)时应显示的标题文本。尽管您的代码会更改当前显示的文本,但只要按钮更改状态,它就会将文本设置回存储值。当显示单元格时,我假设按钮状态是重置的。setTitle
方法更新存储值)。原件
撇开单元重用问题不谈,我认为您的代码不会达到您想要的效果。按照当前编码,布局如下:
Row 0: left: cuisine 0, right: cuisine 1
Row 1: left: cuisine 1, right: cuisine 2
Row 2: left: cuisine 2, right: cuisine 3
我猜你真的想要这个:
Row 0: left: cuisine 0, right: cuisine 1
Row 1: left: cuisine 2, right: cuisine 3
Row 2: left: cuisine 4, right: cuisine 5
如果是这样的话,请修改您的代码如下:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentefiers.oneCusinePreferencesCell.rawValue, forIndexPath: indexPath) as! OneCusinePreferencesTableViewCell
var row = indexPath.row
print("row = \(row)")
let oneCusineDataLeft = Preferences2ViewController.cusines![2*row]
cell.leftButton.titleLabel?.text = oneCusineDataLeft
if (2*row+1) < Preferences2ViewController.cusines!.count{
let oneCusineDataRight = Preferences2ViewController.cusines![2*row+1]
cell.rightButton.titleLabel?.text = oneCusineDataRight
}else {
//I should hide the right button
cell.rightButton.titleLabel?.text = ""
}
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let cusines = Preferences2ViewController.cusines {
if cusines.count % 2 == 0 {
return cusines.count/2
}else {
return (cusines.count+1)/2
}
}else {
return 0
}
}
我还应该注意,您最好使用
UICollectionView
而不是UITableView
,因为前者将更容易和直观地提供多列流。关于ios - 不在UITableViewController内的UItableView上的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34380754/