01/10/2018, 08:46

Vấn đề với static và chuyển dữ liệu giữa các màn hình trong XCODE

Tình hình là thế này, mình đang học xcode và thử làm một ứng dụng đơn giản đó là quản lý học sinh (thêm, xóa, sửa, xem danh sách sinh viên). Tuy nhiên hiện tại mình vướng chỗ chuyển dữ liệu giữa các màn hình. Mình biết có vài cách để chuyển tuy nhiên minh test thử với static listStudent trước cho nhanh. Sau khi add các student vào list thì vẫn OK, tuy nhiên khi chuyển sang màn hình khác thì gặp lỗi “signal sigabrt”(bỏ đoạn add student trong fuction của button add thì chuyển bình thường).

class Static{
public static var listStudent = [Student]()

}
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

var Sender:UserDefaults!

var listClass:[String]!
@IBOutlet weak var txtName: UITextField!
@IBOutlet weak var pickerDate: UIDatePicker!
@IBOutlet weak var pickerClass: UIPickerView!
@IBOutlet weak var txtOther: UITextField!
@IBAction func btnAdd(_ sender: UIButton) {//Add được vào list nhưng khi chuyển màn hình thì bị lỗi signal sigabrt
            let student = Student()
            student.Name = txtName.text!
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "dd/MM/yyyy"
            let dateString = dateFormatter.string(from: pickerDate.date)
           student.Birth = dateString
            student.Class = listClass[pickerClass.selectedRow(inComponent: 0)]
            student.Other = txtOther.text!
            
            Static.listStudent.append(student)
    txtName.text = ""
    txtOther.text = ""
    
}

Mình đoán là các biến trong class đó khi chuyển màn hình thì bị hủy hết gây lỗi gì đó chăng? Ai biết nhờ giúp mình với, Mình cảm ơn

Project của mình dưới đây

MediaFire

StudentManager.zip

MediaFire is a simple to use free service that lets you put all your photos, documents, music, and video in a single place so you can access them anywhere and share them everywhere.

Hung viết 10:50 ngày 01/10/2018

Trong iOS có 1 class là UISegue dùng để chuyển ViewController mới trên nền ViewController cũ.
Sublass UISegue, rồi override method (quên tên rồi, mà lười quá), gọi super trước, rồi viết các lệnh truyền dữ liệu sau câu lệnh super.

UISegue là hiện thực của Command Pattern đối với 2 ViewController khác nhau. Trong Android. Intent cũng tương tự, là kênh truyền giữa 2 Activity.
Đặt các logic truyền dữ liệu, animation khi chuyển Controller trong UISegue này, 2 ViewController hoàn toàn không biết gì về nhau, cũng không cần biết chuyển như thế nào.

Nếu bạn search Google, thì sẽ có các cách khác, delegate, gán property trên presented view controller. Nhưng các cách này làm 2 Controller gắn kết lại với nhau, cũng như hardcode phần navigation trong Controller, khiến Controller có quá nhiều nhiệm vụ. Trước khi Apple giới thiệu UISegue.


Mình hoàn toàn biết là đào mộ nhé.
Do @noname00 sửa nó trào lên.

Bài liên quan
0