2014-11-25 173 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