簡體   English   中英

迅捷2零委托

[英]Swift 2 Nil Delegate

因此,我想創建一個IOS應用程序,該應用程序生成一組學生,將他們添加到課程中,然后顯示學生。 我可以在表格視圖的列表中顯示學生,但現在我想讓用戶觸摸學生的姓名,並轉到帶有有關該學生的信息(姓名最高年級等)的頁面。 學生課是完美無缺的,課程是可行的,我唯一的問題是我不能讓學生從一種觀點轉向另一種觀點。

這是我到目前為止的內容:

//
//  DataTableViewController.swift
//  assignment8
//

import Foundation
import UIKit


class DataTableViewController: UITableViewController {

  var delegate:StudentSelectionDelegate! = nil
  var students = [Student]();
  var course = Course();

  // MARK: - UITableViewDataSource

  override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

  }

  func didSelectStudent(controller:UITableViewController, student:Student!) {

    controller.navigationController?.popViewControllerAnimated(true)

  }

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    self.course = courseStorage.getCourse();
    self.students = course.getArrayOfStudentSortedByLastName();
    return course.count;
  }


  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let row = indexPath.row
    let currentStudent = students[row];
    if (delegate != nil) {
      delegate.didSelectStudent(self,student:currentStudent)
    }
    else {
      print ("delegate is nil :(");
    }
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("studentCell", forIndexPath: indexPath)

    cell.textLabel?.text = students[indexPath.row].lastName + ", " +
      students[indexPath.row].firstName;
    return cell
  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    print("ping");
    if segue.identifier == "studentSegue" {
      let nextScene =  segue.destinationViewController as! studentViewController
      // Pass the selected object to the new view controller.
      if let indexPath = self.tableView.indexPathForSelectedRow {
        let selectedStudent = students[indexPath.row]
        print (selectedStudent.firstName);
        nextScene.student = selectedStudent;
      }
    }
  }
}

//
//  DataViewController.swift
//  assignment8
//

import UIKit



class DataViewController: UIViewController {

  @IBOutlet weak var dataLabel: UILabel!
  var dataObject: String = ""
  let tableData = ["One","Two","Three"];



  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.dataLabel!.text = dataObject
  }

  func tableView(tableView: UITableView!, numberOfRowsInSection section: Int)
    -> Int {
    return self.tableData.count;
  }
}

//
//  studentViewController.swift
//  assignment8
//

import UIKit

protocol StudentSelectionDelegate {
  func didSelectStudent(controller: UITableViewController, student:Student)
}

class studentViewController: UIViewController {

  var delegate = StudentSelectionDelegate.self;

  var name = String();
  var student = Student();


  @IBOutlet weak var StudentName: UILabel!
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
  }

  func didSelectStudent(controller:UITableViewController, student:Student!) {
    student.description;
    print ("pong")
    StudentName.text = student.firstName + " " + student.lastName;

    controller.navigationController?.popViewControllerAnimated(true);
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
  //  override func viewWillAppear(animated: Bool) {
  //    StudentName.text = name
  //  }

}

我的故事板 到目前為止,這是我的故事板。

因此,每當我嘗試單擊學生時,如果代表為零,它將打印我決定使用的消息。 到目前為止,我已經嘗試查看關於SO的所有其他答案,但是沒有一個解決了我的問題。

為了能夠從一個視圖控制器向另一個視圖控制器發送信息,您應該使用segues。 看起來這就是您根據圖像執行的操作。 如果您不知道如何使用Segue,可以在這里找到一個很好的答案: 使用Swift與Segue發送數據

使用segues,您將能夠設置下一個視圖控制器的委托:

protocol MyDelegate {
     func myFunction()
}

class FirstViewController: UIViewController, MyDelegate {

    func myFunction() {
        // do what the function does
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let secondVC = segue.destinationViewController as? SecondViewController {
            secondVC.delegate = self
        }
    }
}


class SecondViewController: UIViewController {
    var delegate: MyDelegate!
}

在您選擇第二個視圖控制器之前(您正在准備進行選擇),將SecondViewController的委托變量設置為self,因為FirstViewController符合MyDelegate協議,因此可以在此處使用。 現在,在SecondViewController中,您可以使用proxy.myFunction delegate.myFunction() ,它將執行在FirstVC函數中編寫的所有操作,因為FirstVC是SecondVC的委托。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM