所以我真的在尝试理解MVC。我已经将应用程序迁移到MVC(ISH(架构中,但我仍然知道我犯了一些错误。对我来说,最令人困惑的部分是视图与控制器部分之间的通信。我在我的控制器(UiviewController(类中定义了所有插座,操作(文本字段,图像视图,按钮操作(,以及所有初始内容(例如属性宽度,高度(。今天,我看到了MVC和M-VC(大量视图控制器(的帖子。现在我更加困惑。
我想要的是我代码的一个示例。我应该在哪里移动插座和其他东西,以及如何在视图和控制器之间建立通信。
这是我对屏幕的看法:
class incidentMgmView: UIView, UIPickerViewDataSource {
var textHeightConstraint: NSLayoutConstraint!
var datePicker: UIDatePicker?
let namePickr = UIPickerView()
var pickerData = namePicker()
// Auto Resizing Text Field Functions
func autoResizeTextView(textView: UITextView){
textView.clipsToBounds = true
textView.layer.cornerRadius = 5
textHeightConstraint = textView.heightAnchor.constraint(equalToConstant: 40)
textHeightConstraint.isActive = true
adjustTextViewHeight(txtView: textView)
}
func adjustTextViewHeight(txtView: UITextView) {
let fixedWidth = txtView.frame.size.width
let newSize = txtView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textHeightConstraint.constant = newSize.height
}
// Exit editing if a touch is registered.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
endEditing(true)
}
// Date Picker View
func datePick(dateTextField: UITextField){
datePicker = UIDatePicker()
datePicker?.datePickerMode = .date
datePicker?.addTarget(incidentMgm(), action: #selector(incidentMgm.dateChanged(datePicker:)), for: .valueChanged)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped(gestureRecognizer:)))
addGestureRecognizer(tapGesture)
dateTextField.inputView = datePicker
let pickerToolBar = toolBarPicker().ToolbarPicker(mySelect: #selector(incidentMgm.dismissDatePicker))
dateTextField.inputAccessoryView = pickerToolBar
}
// Exit editing if a touch is registered.
@objc func viewTapped(gestureRecognizer: UITapGestureRecognizer){
endEditing(true)
}
// Picker View
func namePick(pickerTextField: UITextField){
pickerTextField.inputView = namePickr
namePickr.dataSource = self
let toolBar = toolBarPicker().ToolbarPicker(mySelect: #selector(incidentMgm.dismissPersonPicker))
pickerTextField.inputAccessoryView = toolBar
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView( _ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.contentSize
}
这是此视图的控制器:
class incidentMgm: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate,UITextFieldDelegate, UIPickerViewDelegate,UITextViewDelegate {
// Outlets
@IBOutlet weak var neredeTextField: UITextField!
@IBOutlet weak var aTextField: UITextField!
@IBOutlet weak var hangiTextField: UITextField!
@IBOutlet weak var neTextField: UITextField!
@IBOutlet weak var myTextView: UITextView!
@IBOutlet weak var dateTxtField: UITextField!
@IBOutlet weak var imageView3: UIImageView!
@IBOutlet weak var imageView2: UIImageView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var nameTextField: UITextField!
//
var views = incidentMgmView() // View Class
let imagePicker = UIImagePickerController()
var imagepos = 0
var camimg = UIImage.init(named: "camicon")
var imgArray = [UIImageView]()
override func viewDidLoad() {
super.viewDidLoad()
initialize()
views.namePick(pickerTextField: nameTextField)
views.datePick(dateTextField: dateTxtField)
views.autoResizeTextView(textView: myTextView)
imgTap()
}
// Assinging tags and delegates
func initialize(){
neTextField.delegate = self
dateTxtField.delegate = self
neredeTextField.delegate = self
hangiTextField.delegate = self
aTextField.delegate = self
imagePicker.delegate = self
myTextView.delegate = self
views.namePickr.delegate = self
// Image stuff
imgArray.append(imageView)
imgArray.append(imageView2)
imgArray.append(imageView3)
for i in 0...2{
imgArray[i].image = camimg
imgArray[i].tag = i
}
}
// Image Picker Controller Functions
func imgTap(){
var tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
for imgView in imgArray{
imgView.isUserInteractionEnabled = true
imgView.addGestureRecognizer(tapGestureRecognizer)
tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
}
}
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
_ = tapGestureRecognizer.view as! UIImageView
imagePicker.sourceType = .camera
imagePicker.allowsEditing = false
present(imagePicker, animated: true, completion: nil)
imagepos = tapGestureRecognizer.view!.tag
}
@objc func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage{
for imgView in imgArray {
if(imagepos == imgView.tag){
imgView.image = image
imagePicker.dismiss(animated: true, completion: nil)
}
}
}
}
// Skip to the next text field with return button
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
switch textField{
case neTextField:
dateTxtField.becomeFirstResponder()
break
case dateTxtField:
neredeTextField.becomeFirstResponder()
break
case neredeTextField:
nameTextField.becomeFirstResponder()
break
case hangiTextField:
myTextView.becomeFirstResponder()
break
case myTextView:
aTextField.becomeFirstResponder()
break
default:
textField.resignFirstResponder()
break
}
return true
}
@objc func dismissPersonPicker(textField: UITextField){
hangiTextField.becomeFirstResponder()
}
@objc func dismissDatePicker(textField: UITextField) {
neredeTextField.becomeFirstResponder()
}
@objc func dateChanged(datePicker: UIDatePicker){
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
dateTxtField.text = dateFormatter.string(from: datePicker.date)
}
internal func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
nameTextField.text = views.pickerData.pickerContent[row]
}
func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return views.pickerData.pickerContent[row]
}
func textViewDidChange(_ textView: UITextView) {
views.adjustTextViewHeight(txtView: myTextView)
}
}
这种观点的作用是将带有文本和图像的表单提交给我的服务。
,如果我有一个例子可以为我定义MVC模式,我会感到非常高兴。我尝试阅读许多论坛帖子和Apple的MVC文档,但这根本没有帮助。谢谢...
我强烈建议您为应用程序设计模式使用MVVM。在线上有大量有关它的信息。下面的样本。另一方面,我不建议您使用Viper,因为关于这种设计模式,在线上没有太多详细信息。除此之外,Viper是一个很好的架构。