ลบออกจากอาร์เรย์ใน tableview ที่ดัชนีที่เลือก

ฉันกำลังพยายามลบแถวใน tableview ที่ฉันนำเสนอโดยใช้อาร์เรย์ของวัตถุ ฉันได้เพิ่มปุ่มลบที่มุมและเมื่อคลิกควรลบแถวที่เลือก แต่จะลบแถวแรกเสมอไม่ว่าฉันจะคลิกแถวใดก็ตาม

ฉันประกาศตัวแปรก่อน: private var indexForCell = Int() จากนั้นฉันใช้วิธี tableview didSelectRowAt ดังนี้:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        indexForCell = indexPath.row
    }

จากนั้นฉันก็ใช้ปุ่มที่ฉันเพิ่มเพื่อลบ:

    @IBAction func removePokemon(_ sender: UIButton) {
        favourites.remove(at: indexForCell)
        self.tableView.reloadData()
    }

ซึ่งจะทำให้แถวถูกลบแต่จะเป็นแถวแรกเสมอ ไม่ว่าฉันจะเลือกแถวไหน ระบบจะลบแถวแรกออกเสมอ ฉันจะหยุดสิ่งนี้ได้อย่างไร?


person Sabih    schedule 01.09.2020    source แหล่งที่มา
comment
ดูที่นี่ว่าคุณสามารถลบแถวในมุมมองตารางได้อย่างไร stackoverflow.com/a/52818024/7905888   -  person A. Amini    schedule 01.09.2020
comment
คุณควรอัปเดตคำถามของคุณเพื่อให้ชัดเจนว่าคุณมีปุ่มลบในแต่ละเซลล์ของมุมมองตาราง และคุณต้องการให้แตะปุ่มนั้นและให้ลบเซลล์นั้นได้ หากเป็นกรณีนี้ วิธีการบันทึกดัชนีเซลล์ของคุณเมื่อผู้ใช้เลือกเซลล์จะไม่ทำงาน เนื่องจากคุณสามารถแตะปุ่มบนเซลล์โดยไม่ต้องเลือกเซลล์ก่อนได้   -  person Duncan C    schedule 02.09.2020
comment
เมื่อโพสต์คำถาม คุณต้องอธิบายสถานการณ์โดยละเอียดเพียงพอที่ผู้อ่านจะเข้าใจได้ครบถ้วน คำถามของคุณคลุมเครือและไม่สมบูรณ์ตามที่เขียนไว้ ฉันจะระงับการลงคะแนนเสียงลง แต่จำเป็นต้องปรับปรุง   -  person Duncan C    schedule 02.09.2020


คำตอบ (1)


บรรทัดของโค้ด private var indexForCell = Int() เป็นข้อบกพร่องที่รอที่จะเกิดขึ้น Int() แก้ไขเป็นศูนย์ ซึ่งหมายถึงแถวแรก ดังนั้นหากคุณไม่เคยเลือกแถวเลย แถวนั้นจะพยายามลบแถวแรก

ทำให้ตัวแปรเป็นทางเลือก:

private var indexForCell = Int?

จากนั้นเขียนฟังก์ชันลบของคุณใหม่:

@IBAction func removePokemon(_ sender: UIButton) {
    guard let indexToRemove = indexForCell else {
        print("No index selected")
        return
    }
    favourites.remove(at: indexToRemove)
    self.tableView.reloadData()
}

แต่คุณไม่ได้บอกเราว่าฟังก์ชัน favourites.remove(at:) ของคุณทำอะไร และไม่ได้บอกเราว่าคุณเติมมุมมองตารางของคุณอย่างไร ดังนั้นจึงเป็นเรื่องยากที่จะบอกได้ว่ามีปัญหาอื่นๆ เช่นกัน

(BTW มีวิธีที่ดีกว่าในการลบแต่ละเซลล์มากกว่าการโหลดมุมมองตารางทั้งหมดใหม่ แต่มามุ่งเน้นที่การทำให้แนวทางปัจจุบันของคุณใช้งานได้ในตอนนี้)

แก้ไข:

หากคุณมีปุ่มลบในแต่ละเซลล์ที่คุณต้องการลบรายการโดยไม่ต้องเลือก คุณต้องมีวิธีในการพิจารณาว่าเซลล์ใดมีปุ่มนั้น ฉันเขียนส่วนขยายมุมมองตารางที่ช่วยให้คุณเข้าใจได้ ดูลิงก์นี้: https://stackoverflow.com/a/42043277/205185

person Duncan C    schedule 01.09.2020
comment
นี่มันค่อนข้างได้ผล! อย่างน้อยตอนนี้ฉันก็สามารถลบแถวใดก็ได้ไม่ว่าจะอยู่ที่ดัชนีใดก็ตาม แต่มีปัญหาเล็กน้อย ฉันจะต้องเลือกแถวเพื่อที่จะลบมัน เมื่อฉันคลิกปุ่มที่ฉันสร้างในเซลล์ มันจะไม่พิมพ์ดัชนีที่เลือกไว้ แต่เมื่อฉันคลิกเซลล์นั้นเอง จากนั้นคลิกปุ่ม มันจะลบเซลล์ออก ฉันต้องเลือกเซลล์แล้วคลิกปุ่มบนเซลล์เพื่อลบออก ฉันต้องการให้ลบโดยตรงเมื่อกดปุ่มโดยไม่ต้องเลือกแถว - person Sabih; 01.09.2020
comment
คุณมีปุ่มลบในแต่ละเซลล์หรือไม่? หากเป็นเช่นนั้น คุณจะต้องค้นหาว่าเซลล์ใดมีปุ่มในโค้ดการดำเนินการของคุณ ใช้ frame.origin ของปุ่ม ซึ่งแปลงเป็นพิกัดของมุมมองตาราง เพื่อดูว่าเซลล์ใดมีปุ่มนั้น ฉันเขียนส่วนขยายมุมมองตารางที่ช่วยให้คุณทราบว่าเส้นทางดัชนีใดมีมุมมอง และได้โพสต์ไว้ที่นี่ใน SO ฉันจะพยายามค้นหาลิงค์สำหรับคุณ - person Duncan C; 01.09.2020