gpt4 book ai didi

ios - 以编程方式从带有动画的 customCell 类的 tableView 中删除一行

转载 作者:可可西里 更新时间:2023-11-01 01:31:10 24 4
gpt4 key购买 nike

目标

customTableViewCell 调用的 TableView 中删除一行

我的 CustomTableViewController 中有一个 tableViewdeque 是一个 customTableViewCell

在那个 customTableViewCell 类中,我有一个 UIButton 操作,它需要在按下时更改其 buttonTitle,相应地并在需要时删除行本身。为此,我传递了该单元格的 indexPath 到该 customTableViewCell 类中的 globalVariable,我用它来删除通过 CustomTableViewController 实例访问的行。

代码

从 firebase 和 struct检索数据库的代码是不必要的,仅供引用。

CustomTableViewController 其中嵌入了 tableView:-

class FriendsListController: UIViewController , UITableViewDelegate , UITableViewDataSource,addingFriendDelegate{

var profileFeed = [profileStruct]() //profileFeed is the an array of type struct, in which i am storing my retrieved database value's
var customCellHandler = FriendsTableViewCell()
override func viewDidLoad() {

super.viewDidLoad()
listTableView.delegate = self
listTableView.dataSource = self
customCellHandler.delegate = self
if friendListTable == true && profileFeed.isEmpty == true{

FIRControllerHandle.retrievingForTheFriendListTableView { (userName, lctn, ID) in

let temp = profileStruct.init(userName: userName, location: lctn, UID: ID)
self.profileFeed.insert(temp, atIndex: 0)
self.listTableView.reloadData()
self.presentViews()

}

}else if friendListTable == false && profileFeed.isEmpty == true{

print(profileFeed)
print(profileFeed.isEmpty)

FIRControllerHandle.retrievingForThePendingFriendRequests({ (userName, location, userId) in

if self.profileFeed.isEmpty == true{

let temp = profileStruct.init(userName: userName, location: location, UID: userId)
self.profileFeed.insert(temp, atIndex: 0)
self.listTableView.reloadData()
self.presentViews()
}
})
}
}

//Code for storing the data in a struct is just for reference , trivial w.r.t context of my question

}


//addindFriendDelegate methods
func deleteRowAtTheIndex(index: NSIndexPath){

listTableView.deleteRowsAtIndexPaths([index], withRowAnimation: .Fade)

}


//TableView delegate Functions.

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

return 1
}

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

return profileFeed.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = listTableView.dequeueReusableCellWithIdentifier("friendsCell") as! FriendsTableViewCell

cell.userNameLabel.text = profileFeed[indexPath.row].profileName
cell.userUID = profileFeed[indexPath.row].profileUserId
cell.userName = profileFeed[indexPath.row].profileName
cell.userLocationLabel.text = profileFeed[indexPath.row].profileLocation
cell.currentUserName = currentuserName_initial
cell.friendsListBool = friendListTable
cell.cellIndexPath = indexPath //Sending the indexPath of that row


return cell

}
}

customTableViewCell 响应按钮操作的类:-

protocol addingFriendDelegate {
func deleteRowAtTheIndex(index: NSIndexPath)
}

class FriendsTableViewCell: UITableViewCell {

var userName : String!
var userLocation : String!
var userUID : String!
var FIRControllerHandle : FIRController = FIRController() //I am using firebase as my backend and `FIRController` class handles all the firebase functions.
var delegate: addingFriendDelegate!
var friendsListBool : Bool = true // I am managing two tableViews datasource in one tableView , and `friendsListBool` tells me which node to retrieve from my database.
var currentUserName : String!
var cellIndexPath : NSIndexPath!
var listTableViewController : FriendsListController = FriendsListController() // Instance of viewController in which my tableView is embed


@IBAction func addFriendsBtnAction(sender: CustomButton) {

if friendsListBool{
FIRControllerHandle.sendFriendRequest(userUID, completionBlock: {

self.addFriendsBtn.setTitle("Sent", forState: .Normal) //Setting the title

print(self.cellIndexPath.row) //Printing Fine
self.listTableViewController.listTableView.deleteRowsAtIndexPaths([self.cellIndexPath], withRowAnimation: .Fade)


})

} else if !friendsListBool {

FIRControllerHandle.accepFriendRequest(currentUserName, friendID: userUID, friendName : userName ,completionBlock: {

self.addFriendsBtn.setTitle("Friends", forState: .Normal)



})
}
}
}

我尝试了什么

self.listTableViewController.listTableView.deleteRowsAtIndexPaths([self.cellIndexPath], withRowAnimation: .Fade)

@IBAction func addFriendsBtnAction(sender: CustomButton) 中调用,其中 listTableViewController 是嵌入我的 tableView 的 viewController 实例,cellIndexPath我要删除的行的索引路径

错误线

self.listTableViewController.listTableView.deleteRowsAtIndexPaths([self.cellIndexPath], withRowAnimation: .Fade)

错误:- fatal error :在展开可选值时意外发现 nil

(lldb)

PS:- 我不是特别倾向于 protocol-delegate 方法。我正在寻找替代方法。

最佳答案

永远不要使用像FriendsListController()这样的默认初始化器来初始化 View Controller 。
它将创建一个全新的实例,这不是您在 View 层次结构中期望的实例。

协议(protocol)/委托(delegate)的合适替代方案是完成闭包。

根据您最新的代码更改以下内容:

  • 删除

    var customCellHandler = FriendsTableViewCell()
    var delegate: addingFriendDelegate!
  • 插入cellForRowAtIndexPath

    cell.delegate = self
  • 插入deleteRowAtTheIndex

    profileFeed.removeAtIndex(index.row)

关于ios - 以编程方式从带有动画的 customCell 类的 tableView 中删除一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com