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