ios - Swift Segmented Control Change Index Event,TableView 不更新

标签 ios swift uitableview

我想根据分段控件的更改从 Web 服务更新 TableView 。作为我的代码,我触发了事件 segmentedControlAction 以更新 viewDidAppear 事件中的 tableview。 它第一次在屏幕加载时工作,但在我选择下一个选项卡(以下)时不工作,它从 Web 服务获取数据而不更新 TableView 。但是当我切换到第一个“关注者”选项卡然后再次切换到“关注者”选项卡时它起作用了,因为它存储从以前的网络服务获取的数据

  • Datasource(ds) 是从网络服务获取数据,如果它没有记录的话

  • TsButton 是自定义类,只有一个成员变量是object,用于传递额外信息给按钮点击事件

在 StoryBoard 中有两个控件 Segmented Control 和 tableview 就像在屏幕截图中一样

enter image description here

我的代码在下面

class UserFollowController: BaseViewController
{
    @IBOutlet var segmentedControl: UISegmentedControl!

    @IBOutlet var tableView: UITableView!

    private var ds : UserFollowTableDataSource!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        ds = UserFollowTableDataSource(vc: self, tableView: tableView);
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        if UserEntity.instance.username.characters.count == 0
        {
            let storyBoard : UIStoryboard = UIStoryboard(name:"Main", bundle:nil)

            let vc = storyBoard.instantiateViewController(withIdentifier: "LoginController") as! LoginController

            self.tabBarController?.selectedIndex = 0
            self.present(vc, animated: true, completion: nil)
        }
        else
        {
            self.segmentedControlAction(sender: nil);
        }

    }

    @IBAction func segmentedControlAction(sender: AnyObject?) {

        if(segmentedControl.selectedSegmentIndex == 0)
        {
            ds.fetchFromWeb(type: "follower")
        }
        else
        {
            ds.fetchFromWeb(type: "following")
        }
    }
}


class UserFollowTableDataSource : NSObject, UITableViewDataSource
{
    private var follower_records : [[String : Any]]?;
    private var following_records : [[String : Any]]?;
    private var records : [[String : Any]]?;

    private var tableView : UITableView!;
    private var vc : UserFollowController!;
    private var loader : UIAlertController!;
    private var type : String!

    init(vc : UserFollowController, tableView : UITableView)
    {
        self.vc = vc;
        self.tableView = tableView
        self.loader = CommonUtil.getLoader(msg: "Getting List...");

        super.init()

        self.tableView.dataSource = self;
    }

    public func fetchFromWeb(type : String)
    {
        self.type = type;

        self.loader.title = "Getting List...";

        if (type == "follower")
        {
            if let data = self.follower_records
            {
                self.records = data;
                self.tableView.reloadData();
                self.tableView.setNeedsDisplay();
                return;
            }

            self.vc.present(self.loader, animated: true, completion: nil)

            HauteWebService.instance.get_user_followers(onSucess: { (response) in

                if (response.status == 1)
                {
                    DispatchQueue.main.async {

                        self.loader.dismiss(animated: true, completion: {
                            self.follower_records = response.data as! [[String : Any]]
                            self.records = self.follower_records
                            self.tableView.reloadData();
                        });

                    }
                }
                else
                {
                    self._onError(msg: response.msg);
                }

            }, onFailure: { (msg) in

                self._onError(msg: msg);
            })
        }
        else
        {
            if let data = self.following_records
            {
                self.records = data;
                self.tableView.reloadData();
                self.tableView.setNeedsDisplay();
                return;
            }

            self.vc.present(self.loader, animated: true, completion: nil)

            HauteWebService.instance.get_user_following(onSucess: { (response) in

                if (response.status == 1)
                {
                    DispatchQueue.main.async {

                        self.loader.dismiss(animated: true, completion: {
                            self.following_records = response.data as! [[String : Any]]
                            self.records = self.follower_records
                            self.tableView.reloadData();
                        })
                    }

                }
                else
                {
                    self._onError(msg: response.msg);
                }

            }, onFailure: { (msg) in

                self._onError(msg: msg);
            })
        }
    }

    private func _onError(msg : String)
    {
        DispatchQueue.main.async {
            self.loader.dismiss(animated: true, completion: {
                let alert = CommonUtil.getAlertError(title: "Error while getting web service", msg: msg);
                self.vc?.present(alert, animated: true, completion: nil)
            })
        }
    }

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

        if self.records != nil
        {
            return self.records!.count;
        }

        return 0;
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FollowTableCell", for: indexPath) as! FollowTableCell

        let index = indexPath.row;

        cell.tag = index;
        if let record = self.records![index] as? [String : Any]
        {
            let first = record["firstname"] as! String
            let last = record["lastname"] as! String

            cell.lblName.text = first + " " + last;

            var add = record["city"] as! String;
            let state = record["state"] as! String;

            if state != ""
            {
                add = add + ", " + state
            }

            cell.lblAddress.text = add;
            cell.btnFollow.backgroundColor = TFColor.hexToUIColor(hex: "#AAAAAA")
            cell.btnFollow.setTitle("Follow", for: .normal)

            cell.btnFollow.object = record;
            if let v = record["is_followed"] as? Int
            {
                if (v == 1)
                {
                    cell.btnFollow.backgroundColor = TFColor.hexToUIColor(hex: "#887474")
                    cell.btnFollow.setTitle("Following", for: .normal)
                }
            }

            cell.btnFollow.addTarget(self, action: #selector(self.btnFollowClick), for: .touchUpInside)

            cell.ratingStar.changeEvent = false;
            if let v = Float(record["rating"] as! String)
            {
                cell.ratingStar.rating = Int(v)
            }
            else
            {
                cell.ratingStar.rating = 0;
            }

            cell.imgProfile.image = UIImage(named: "no_image");

            if let url = record["profile_image_url"] as? String
            {
                if let img = ImageEntity.readCache(key: url)
                {
                    cell.imgProfile.image = img
                }
                else
                {
                    HauteWebService.instance.downloadFile(url: url, onSucess: { (data) in

                        if let img = UIImage(data: data)
                        {
                            ImageEntity.writeCache(key: url, image: img)

                            DispatchQueue.main.async {
                                if cell.tag == index
                                {
                                    cell.imgProfile.image = img
                                }
                            }
                        }

                    }, onFailure: { (msg) in

                    })
                }
            }
        }

        return cell;
    }

    @objc func btnFollowClick(_ sender: TsButton)
    {
        let record = sender.object as! [String : Any];

        let id = record["id"] as! String;

        let data = ["user_id" : id]

        if let v = record["is_followed"] as? Int
        {
            self.loader.title = "Please Wait...";

            vc.present(self.loader, animated: true, completion: nil);

            if (v == 1)
            {
                HauteWebService.instance.delete_user_follow(data: data, onSucess: { (response) in

                    if (response.status == 1)
                    {
                        DispatchQueue.main.async {
                            self.loader.dismiss(animated: false, completion: {
                                DispatchQueue.main.async {
                                    self.follower_records = nil
                                    self.following_records = nil
                                    self.fetchFromWeb(type : self.type)
                                }
                            });
                        }
                    }
                    else
                    {
                        self._onError(msg: response.msg)
                    }

                }, onFailure: { (msg) in

                    self._onError(msg: msg);
                })
            }
            else
            {
                HauteWebService.instance.save_user_follow(data: data, onSucess: { (response) in

                    if (response.status == 1)
                    {
                        DispatchQueue.main.async {
                            self.loader.dismiss(animated: false, completion: {
                                DispatchQueue.main.async {
                                    self.follower_records = nil
                                    self.following_records = nil
                                    self.fetchFromWeb(type : self.type)
                                }
                            });
                        }
                    }
                    else
                    {
                        self._onError(msg: response.msg)
                    }

                }, onFailure: { (msg) in

                    self._onError(msg: msg);
                })
            }
        }
    }
}


class FollowTableCell : UITableViewCell
{
    @IBOutlet var imgProfile : UIImageView!

    @IBOutlet var actvityImgProfile : UIActivityIndicatorView!

    @IBOutlet var lblName : UILabel!

    @IBOutlet var lblAddress : UILabel!

    @IBOutlet var btnFollow : TsButton!

    @IBOutlet var ratingStar : TsRatingStar!
}

最佳答案

在您的以下网络服务回调中,您有

self.following_records = response.data as! [[String : Any]]
self.records = self.follower_records

因此您在网络服务回调中将 tableView 的记录设置为错误的值。

应该是:

self.following_records = response.data as! [[String : Any]]
self.records = self.following_records

关于ios - Swift Segmented Control Change Index Event,TableView 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271674/

相关文章:

objective-c - 在 0 : 8/attempt to write a readonly database 之后意外无法执行 BEGIN IMMEDIATE

ios - 没有互联网的 NSNotification

ios - 出现键盘时 UITableViewController 不 ScrollView

ios - 为 arm64 和 x86_64 为 iOS 编译 Libical

ios - 没有从纬度和经度获得正确的地址

ios - 是否可以定位 map View ,使用户的当前位置不在 View 的中心?

ios - 将图像从 iOS 应用程序发送到服务器的正确方法

swift - UITapGestureRecognizer : Modal View is overlapped by another view

iOS-Swift UIApplication.shared.isIdleTimerDisabled = true 在 AppStore 审核后不起作用

iphone - 很难理解toValue, byValue of CABasicAnimation, ios