每次用户签名时,TableView 都会重新加载并添加(重复)原始数据

Posted

技术标签:

【中文标题】每次用户签名时,TableView 都会重新加载并添加(重复)原始数据【英文标题】:TableView reloads and adds(repeats) the original data every time user signs 【发布时间】:2018-08-27 13:28:44 【问题描述】:

在我的 ios 应用程序中使用 Firebase 登录时,我的 tableview 遇到了问题。该表从子提要加载内容。当我第一次登录表时加载正常,但如果我退出并再次登录,表会重新加载所有数据,将原始数据添加到表的内容中。我尝试在重新加载之前检查表是否为空,但没有效果。

关闭应用程序没有问题。只有当用户使用帐户视图控制器中的签名按钮退出应用程序并重新登录时,才会出现问题。我想弄清楚是什么让表向其中添加相同的数据,或者当用户清空表时退出,但无法找出其中任何一个。

这是加载函数的代码。我已将此代码放在 viewWillAppear 或 viewDidLoad 中,但没有任何区别。

    if tableView.visibleCells.isEmpty 
        loadTableData()
     else 
        //do something
    

这是我的加载数据函数

func loadTableData() 
    let url = "https://JSONurl.json"
    let headers: HTTPHeaders = [
        "X-API-Key": api.key,
        "Accept": "application/json"
    ]

    Alamofire.request(url, headers: headers).validate().responseJSON  response in
        switch response.result 
        case .success:
            if let value = response.result.value 
                let json = JSON(value)
                self.parseJSON(json: json)
                self.tableView.reloadData()
            
        case .failure(let error):
            let alert = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.alert)
            let okAction = UIAlertAction(title: "title", style: UIAlertActionStyle.default, handler: nil)
            alert.addAction(okAction)
            self.present(alert, animated: true, completion: nil)
            print(error)
        
    

在我的签名视图控制器中,我使用以下代码对用户进行身份验证

func authenticateUser() 
    guard let userEmailAddress = userEmailAddressTextField.text, !userEmailAddress.isEmpty else 
        // alert error message
        return
    

    guard let userPassword = userPasswordTextField.text, !userPassword.isEmpty else 
        // alert error message
        return
    

    Auth.auth().signIn(withEmail: userEmailAddress, password: userPassword) 
        (user, error) in
        if let error = error 
            self.commonFunctions.showAlertMessage(viewController: self, alertTitle: AppConstants.AlertMessages.firebaseAuthErrorTitle, messageToDisplay: error.localizedDescription)
            return
        
        if user != nil 
            let mainPage = self.storyboard?.instantiateViewController(withIdentifier: "viewControllerWithTable") as! UITabBarController
            self.present(mainPage, animated: true, completion: nil)
        
    

这是我在 didFinishLaunchingWithOptions 函数内的 AppDelegate 中的代码。这样用户在关闭应用程序时不必再次登录。

    if Auth.auth().currentUser != nil && Auth.auth().currentUser!.isEmailVerified 
        let mainStoryBoard: UIStoryboard = UIStoryboard(name:"Main", bundle:nil)
        let nextView: UITabBarController = mainStoryBoard.instantiateViewController(withIdentifier: "viewControllerWithTable") as! UITabBarController
        self.window?.rootViewController = nextView
    

我的 parseJSON 如下:

func parseJSON(json: JSON) 
    for item in json["results"][0]["members"].arrayValue 
        item.id = (item["id"].stringValue)
        // omitted extra data
        let eachItem = ItemInit(id: item.id!)
        items.group.append(eachItem)
    
    sortData()
    utils.hideActivityIndicator()

当用户点击按钮时,我的退出位于 IBAction 内。我将用户发送回 WelcomeViewController,用户可以在其中选择如何再次登录(电子邮件、社交媒体)。

    do 

        try Auth.auth().signOut()
        let nextView  = self.storyboard?.instantiateViewController(withIdentifier: "WelcomeViewController") as! WelcomeViewController
        let appDelegate = UIApplication.shared.delegate
        appDelegate?.window??.rootViewController = nextView

     catch
        // alert user
    

【问题讨论】:

删除这个 tableView.visibleCells.isEmpty 因为它没用,你只需要在添加数据之前清除 dataSource 数组 您能否展示一下您是如何实现此功能的parseJSON(json: json)。还有,你是如何处理注销的 我在上面添加了 parseJSON 和注销。谢谢 我尝试在添加数据之前清除 dataSource 数组,但这不起作用。 你在哪里清理你的数据源?您可以尝试在 ViewWillAppear 函数中清除它吗?您还可以显示您的 tableView(tableView: UITableView, numberOfRowsInSection section: Int) 函数吗? 【参考方案1】:

尝试在添加任何内容之前清理您的数据源。

func parseJSON(json: JSON) 
    items.group.removeAll()
    for item in json["results"][0]["members"].arrayValue 
        item.id = (item["id"].stringValue)
        // omitted extra data
        let eachItem = ItemInit(id: item.id!)
        items.group.append(eachItem)
    
    sortData()
    utils.hideActivityIndicator()

【讨论】:

【参考方案2】:

好吧,我不知道为什么上面提到的其他选项不起作用,但这就是我最终要做的。我使用了通知中心 我在退出视图控制器下方添加了这个

NotificationCenter.default.post(name: Notification.Name("clearTable"), object: nil)

在带有表格的视图控制器上,我在 ViewDidLoad 中添加了这个:

NotificationCenter.default.addObserver(self, selector: #selector(clearTable), name: Notification.Name("clearTable"), object: nil)

并添加了以下功能:

@objc func clearTable() 
    items.group.removeAll()

我仍然不明白为什么在加载表格之前放置 items.group.removeAll() 不起作用。看起来几乎一样。

【讨论】:

以上是关于每次用户签名时,TableView 都会重新加载并添加(重复)原始数据的主要内容,如果未能解决你的问题,请参考以下文章

重新加载数据时 Tableview 崩溃

旋转后图像变质

重新加载tableview ios 8时编辑选项消失了

Miles Away 没有在重新加载时更新

无法重新加载 UITableView

每次视图出现时 tableView.reloadData()