2014-11-25 106 views
0

我已经尝试了其他方法的委托和协议在模态视图和父视图按钮之间传递数据他们不为我工作。这显然是因为我错误地实施了他们。委托模态视图swift

我有一个父视图控制器,它有一个tableviewcell,它在正确的细节将告诉你你从模态视图的选择。模态视图是另一个表视图,它允许您选择一个单元格,它更新正确的细节并关闭模态视图。除了实际的数据传输,所有工作都正常。

在此先感谢! :)

这里是我的父视图控制器代码:

class TableViewController: UITableViewController, UITextFieldDelegate { 

//Properties 

var delegate: transferData? 

//Outlets 
@IBOutlet var productLabel: UILabel! 
@IBOutlet var rightDetail: UILabel! 





override func viewWillAppear(animated: Bool) { 
    println(delegate?.productCarrier) 
    println(delegate?.priceCarrier) 
    if delegate?.productCarrier != "" { 
     rightDetail.text = delegate?.productCarrier 
     productLabel.text = delegate?.productCarrier 
    } 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

} 



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 Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 5 
} 

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

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.deselectRowAtIndexPath(indexPath, animated: true) 
} 



} 

为模型视图控制器和协议的代码:

protocol transferData { 
var priceCarrier: Double { get set } 
var productCarrier: String { get set } 
} 

class ProductsDetailsViewController: UITableViewController, transferData { 
//Properties 

var priceCarrier = 00.00 
var productCarrier = "" 


//Outlets 


//Actions 

@IBAction func unwindToViewController(segue: UIStoryboardSegue) { 
    self.dismissViewControllerAnimated(true, completion: nil) 


} 


override func viewDidLoad() { 
    super.viewDidLoad() 
    populateDefaultCategories() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

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 Potentially incomplete method implementation. 
    // Return the number of sections. 
    return Int(Category.allObjects().count) 
} 


override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return (Category.allObjects()[UInt(section)] as Category).name 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 

    return Int(objectsForSection(section).count) 


} 

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

    var cell:ProductListCell = tableView.dequeueReusableCellWithIdentifier("productCell", forIndexPath: indexPath) as ProductListCell 

    let queriedProductResult = objectForProductFromSection(indexPath.section, indexPath.row) 

    cell.name.text = queriedProductResult.name 
    cell.prices.text = "$\(queriedProductResult.price)" 

return cell 


} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let indexPath = self.tableView.indexPathForSelectedRow()! 

    let product = objectForProductFromSection(indexPath.section, indexPath.row) 

    let PVC: TableViewController = TableViewController() 

    println("didSelect") 
    productCarrier = product.name 
    priceCarrier = product.price 

    println(productCarrier) 
    println(priceCarrier) 


    self.dismissViewControllerAnimated(true, completion: nil) 


} 

回答

0

我想传递数据,你应该使用SEGUE像:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

let indexPath = self.tableView.indexPathForSelectedRow()! 
let product = objectForProductFromSection(indexPath.section, indexPath.row) 

println("didSelect") 
productCarrier = product.name 
priceCarrier = product.price 

println(productCarrier) 
println(priceCarrier) 

self.performSegueWithIdentifier("displayYourTableViewControllerSegue", sender: self) 

}

,然后重写prepareForSegue功能:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    var controller = segue.destinationViewController as TableViewController 
    controller.rightDetail.text = "\(self.priceCarrier)" 
    controller.productLabel.text = self.productCarrier 
    } 
+0

所以其代码放在哪个文件难过吗?谢谢虽然@Florian – Tomblasta 2014-11-25 11:04:02

+0

对不起,我实现了这一点,它仍然无法正常工作。有没有办法与代表一起做? @thelion – Tomblasta 2014-11-25 22:21:20

+0

所有这些代码都转到Container文件。什么没有用?因为使用委托传输数据感觉很奇怪。对我来说,代表应该用于回调函数(例如)。 此外,每次需要传输数据时,您都必须创建一个协议。 – Florian 2014-11-26 03:16:07