将TableviewController B中的图标和名称传递给TableviewController A.

时间:2016-04-18 07:01:53

标签: ios swift uitableview delegates protocols

我正在尝试从tableview控制器B传递图标和名称,以通过委托来查看控制器A.

简单来说,用户会看到ViewController A :(此处显示)

ViewController A和源代码

enter image description here

ViewController一个来源

 //
 //  MasterTableViewController.swift
 //  Sample image
 //
 //

 import UIKit

 class MasterTableViewController: UITableViewController, IconselectedDelegate    {

@IBOutlet weak var passedIconName: UILabel!

var tempname: String?

override func viewDidLoad() {
    super.viewDidLoad()

   self.title = "Master"
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)

}

func iconName(iconName: String) -> String {

    self.tempname = iconName

    self.passedIconName.text = "\(iconName)"

    return tempname!
}

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

因此,当用户点击此单元格时,将向用户呈现另一个显示图标列表的视图控制器(viewController B)。以下是此示例的屏幕截图和源代码。

ViewController B

enter image description here

以下是Viewcontroller B的示例代码 ViewController B代码

//
//  IconTableViewController.swift
//  Sample image
//
//  Created by me on 4/18/16.
//

import UIKit

protocol IconselectedDelegate {
func iconName(iconName: String)-> String
}

 class IconTableViewController: UITableViewController {

enum Icon: Int {
    case Study
    case Apple

    var icon: UIImage {
        switch self {
        case.Study: return UIImage(named: "study")!
        case.Apple: return UIImage(named: "apple")!
        }
    }
}


var icons = ["Study", "Apple"]

var delegate: IconselectedDelegate? = nil
var selectedIndex = 0

// holding vars
var image: UIImage?
var name: String?


override func viewDidLoad() {
    super.viewDidLoad()


    self.title = "Icon selection"


}

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return icons.count
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell: UITableViewCell! = tableView.cellForRowAtIndexPath(indexPath)

    if cell.accessoryType == UITableViewCellAccessoryType.None {


        if indexPath.row == 0 {

            self.name = icons[0]

        } else if indexPath.row == 1 {
            self.name = icons[1]
        }


        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        self.navigationController?.popToRootViewControllerAnimated(true)
    }

    selectedIndex = indexPath.row

    tableView.reloadData()
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {


    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! IconTableViewCell



    // Configure the cell...
    cell.iconName.text = icons[indexPath.row]

    if let iconIndex = Icon(rawValue: indexPath.row) {

        cell.iconPreview.image = iconIndex.icon
    }

    return cell
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillAppear(true)

    if name == nil {
        delegate?.iconName("None")
    } else {
        delegate?.iconName(name!)
        print("Delegate left with \(delegate?.iconName(name!))")
    }
}


 }

问题

我想将所选图标传回主视图控制器,同时显示名称和图标图像。 (在主视图控制器中,有一个UIImage对象,但您无法在UILable旁边看到它' select')

我怎样才能做到这一点?我使用这个类似的代码来完成UIColor,但它起作用但它似乎不能用于图像。

会有很大帮助

2 个答案:

答案 0 :(得分:3)

将DestinationViewController中的值设置回Primary(First)ViewController

1。实施协议,例如创建一个名为protocol.swift的文件。

    protocol SetIconValueDelegate {
       func didChoose(icon:Icon)
    }

2. 在第二个ViewController上设置委托

    class yourNextViewControllerClass {

    var delegate:SetIconValueDelegate?

3. 在加载secondViewController时设置委托(带有图标详细信息)

    if(segue.identifier == "yourIdentifierInStoryboard") {

        var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
        yourNextViewController.delegate = self

4. 将功能添加到FirstViewController

    func didChoose(icon:Icon) {
        // set here whatever you want 
    }

5. 从SecondViewController调用此函数

     delegate?.didChoose(icon) // this will send your "icon" object - run this from didSelectRowAtIndexPath

6. 在FirstViewController中设置委托

    class FirstViewController: UIViewController, setIconValueDelegate {

答案 1 :(得分:0)

您可以使用Update CTLSTAGE.VMR226DEV_HSD_SUB A set A.ATM_IP_IND = 'ATM' where (A.SW_SITE_CD,A.DEV_NM) = ( select SW_SITE_CD,DEV_NM from CTLSTAGE.ATM_IP_REF where FTTC_E_IND = 'Y' ) ; COMMIT ; 方法将数据发送回上一个视图控制器。

IN CURRENT VC:

delegate(protocol)

在班上制作一个var。

protocol MyProtocol: class
{
    func sendArrayToPreviousVC(myArray:[AnyObject])
}

现在,在弹出视图控制器时调用协议方法,使用"属性"数组作为参数。 (在你的情况下从选择行传递你想要的图标或名称)

 weak var mDelegate:MyProtocol?

以前的VC:

在您之前的VC中,当您按下当前VC时,将mDelegate属性设置为self。

 mDelegate?.sendArrayToPreviousVC(properties)

现在在之前的VC中实现协议方法。

  currentVC.mDelegate = self
  //PUSH VC

这是如何在导航堆栈中发回数据的场景。根据您的数据和要求进行调整。

您应该使用didselect行委托方法来传递数据。 希望这会有所帮助:)