Wednesday, October 4, 2017

Xóa dòng tableView

Sau khi đã biết cách ghi và đọc dữ liệu, bây giờ ta sẽ xóa dòng tableView mà sau đó mở lại class thì nó đã mất dòng đó chứ không hiện lại toàn bộ như trước.
Để làm việc này, trong class đã có tableView mẫu trước đó, ta biến mảng qua thành một file có tên ghi.txt mà từng dòng của nó là từng phần tử của mảng.
Mục đích là ta sẽ dùng file này để xóa dòng, khi xóa thì ta lưu file mới nên mỗi khi bật ra class nó không load lại toàn bộ mảng qua nữa.
Chú ý là ta chỉ ghi file ghi.txt duy nhất một lần đầu tiên. Nếu lần nào mở ra cũng ghi, ta sẽ lại có liên tiếp các phần tử quả nối đuôi vào danh sách.
Để làm việc này, trước khi ghi ta sẽ đọc file ghi.txt ra thành mảng, nếu mảng rỗng tức là chưa có file đó thì ta mới ghi. Còn nếu đã có dữ liệu thì ta không ghi nữa.
Copy các hàm sau xuống trên ngoặc đóng cuối cùng.
func doc()->Int{
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] asNSString
let path = documentsPath.stringByAppendingPathComponent("ghi.txt")
var read : String = ""
var t=0
do {
try read = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) asString
            t = read.characters.count
        }
catchlet error asNSError {
// print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
        }
return t
    }

func doc2()->[String]{
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] asNSString
let path = documentsPath.stringByAppendingPathComponent("ghi.txt")
var read2 : String = ""
var q=[String]()
do {
try read2 = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) asString
var ar = read2.componentsSeparatedByString("\n")
let c=ar.count
            ar.removeAtIndex(c-1)
var qu = [String](count: ar.count, repeatedValue: " ")
for i in0..<ar.count {
                qu[i]=ar[i]
            }
                q=qu
        }
catchlet error asNSError {
// print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
        }
return q
    }

func rite(content: String, _ fileName: String) {
let contentToAppend = content+"\n"
let filePath = NSHomeDirectory() + "/Documents/" + fileName
//Check if file exists
iflet fileHandle = NSFileHandle(forWritingAtPath: filePath) {
//Append to file
            fileHandle.seekToEndOfFile()
            fileHandle.writeData(contentToAppend.dataUsingEncoding(NSUTF8StringEncoding)!)
        }
else {
//Create new file
do {
try contentToAppend.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
            } catch {
print("Error creating \(filePath)")
            }
        }
    }
func rite2(content: String,_ fileName: String) {
let contentToAppend = content
let filePath = NSHomeDirectory() + "/Documents/" + fileName
//Check if file exists
iflet fileHandle = NSFileHandle(forWritingAtPath: filePath) {
//Append to file
//  fileHandle.seekToEndOfFile()
// fileHandle.writeData(contentToAppend.dataUsingEncoding(NSUTF8StringEncoding)!)
do {
try content.writeToFile(filePath, atomically: false, encoding: NSUTF8StringEncoding)
            } catch {
print("Error creating \(filePath)")
            }
        }
else {
//Create new file
do {
try contentToAppend.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
            } catch {
print("Error creating \(filePath)")
            }
        }
    }
Xem qua các hàm một chút, hàm doc() thứ nhất trả lại số ký tự của chuỗi, nếu nó=0 tức chưa có chuỗi.
Hàm doc2() trả lại mảng theo từng dòng của cái đã ghi vào.
Dòng ar.removeAtIndex(c-1) là để bỏ đi cái dòng cuối không có gì được tạo ra bởi cái dấu "\n" tức là dấu xuống dòng.
Hàm rite() thứ nhất ghi ký tự vào theo từng dòng, nếu đã có ký tự cũ, nó ghi thêm xuống dưới.
Hàm rite2 ghi toàn bộ vào đè lên nội dung cũ.
Ta đang làm ở class mẫu có sẵn nên các khai báo tableView, mảng qua đã có rồi, thêm các dòng sau vào trong viewDidLoad.
var t=doc()
var g=""
for i in0..<qua.count {
            g=g+qua[i]+"\n"
        }
let g2=g.characters.dropLast()
let gi=String(g2)
if(t==0){
rite(gi,"ghi.txt")
        }
qua2 = doc2()
Đầu tiên ta đọc file ghi.txt, nếu t=0 tức chưa có gì thì ta ghi mảng quả vào thành từng dòng.
Ta tạo chuỗi g, sau đó dropLast để bỏ cái dòng trống cuối cùng đi, rồi mới ghi vào.
Dòng  qua2 = doc2() là ta đọc để lấy dữ liệu ra mảng qua2.
Bây giờ sửa toàn bộ mảng qua trong các hàm của tableView thành qua2, nếu không sẽ bị lỗi.
Copy thêm vào trong hàm xóa các dòng sau.
var s=""
for i in0..<self.qua2.count{
                s = s+self.qua2[i]+"\n"
            }
self.rite2("","ghi.txt")
let s2=s.characters.dropLast()
let gi=String(s2)

self.rite(gi, "ghi.txt")
im
Ta bỏ dòng đã xóa trong mảng qua2 rồi dùng hàm rite2() xóa trắng file ghi.txt bằng cách ghi đè vào một ký tự rỗng.
Sau đó tạo chuỗi từ mảng qua2 đã bỏ bớt phần tử, chặt bỏ dòng trống cuối, dùng hàm rite() ghi lại vào file ghi.txt.
Bây giờ chạy thử bạn sẽ thấy các dòng bị xóa không hiện lại khi mở lại class.



Trong ảnh chỗ nút sửa tôi comment bỏ đi, nếu muốn cho vào sửa bạn cũng làm y như xóa, ta thay dòng đã sửa bằng dòng mới rồi ghi lại mảng thôi. Dưới đây là ví dụ mảng có tên ani.
ani.removeAtIndex(dong)
ani.insert(info,atIndex:dong)
tableView.reloadData()
var s=""
for i in0..<self.ani.count{
            s = s+self.ani[i]+"\n"
        }
self.rite2("","ghi.txt")

self.rite(s, "ghi.txt")

No comments:

Post a Comment