我有一个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
    }

}

这是表格视图(如果你想要的话)
ios - 不在UITableViewController内的UItableView上的怪异行为-LMLPHP
如果你看不到我的问题描述,我可以给你做一个视频
更新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)

相反。(本质上,aUIButton会跟踪处于不同“状态”(正常、选定等)时应显示的标题文本。尽管您的代码会更改当前显示的文本,但只要按钮更改状态,它就会将文本设置回存储值。当显示单元格时,我假设按钮状态是重置的。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/

10-13 04:07