2016-06-17 13 views
0

私は非常に簡単な商品注文アプリケーションを構築しています。 これはタブ付きのアプリケーションで、製品リスト、オーダーリスト、および設定です。 製品リスト(リモートcsvファイルから解析されたcoredata)から、行を選択して、行を選択して、警告表示をポップして希望の数量をテキストフィールドに追加し、alertviewの「ADD」ボタンで4つの文字列Productcode、Detail、Quantity(alertviewから)、バーコード)をOrder List View Controllerに送信します。 これはどこに問題があるのですか? OrderListで受け取った時点で4つの文字列をコンソールに出力できますが、これらの文字列をMy NSObjectモデルに渡してtableviewcellのラベルに表示して保持する方法が残っています。ここで別のtableviewcontrollerから受け取った文字列を渡す

は私のOrderProduct.swiftファイルです:

import Foundation 
import UIKit 


class OrderProduct: NSObject, NSCoding { 

var uuid: String = NSUUID().UUIDString 
var productcode:String = "" 
var detail:String = "" 
var quantity:String = "" 
var barcode:String = "" 
var inOrderList = false 

func encodeWithCoder(coder: NSCoder) { 
    coder.encodeObject(uuid, forKey: "uuid") 
    coder.encodeObject(productcode, forKey: "productcode") 
    coder.encodeObject(detail, forKey: "detail") 
    coder.encodeObject(quantity, forKey: "quantity") 
    coder.encodeObject(barcode, forKey: "barcode") 
    coder.encodeBool(inOrderList, forKey: "inOrderList") 
} 
required init?(coder decoder: NSCoder) { 
    super.init() 

    if let archivedUuid = decoder.decodeObjectForKey("uuid") as? String { 
     uuid = archivedUuid 
    } 

    if let archivedProductcode = decoder.decodeObjectForKey("productcode") as? String { 
     productcode = archivedProductcode 
    } 

    if let archivedDetail = decoder.decodeObjectForKey("detail") as? String { 
     detail = archivedDetail 
    } 

    if let archivedQuantity = decoder.decodeObjectForKey("quantity") as? String { 
     quantity = archivedQuantity 
    } 

    if let archivedBarcode = decoder.decodeObjectForKey("barcode") as? String { 
     barcode = archivedBarcode 
    } 

    inOrderList = decoder.decodeBoolForKey("inOrderList") 
} 
init(productcode: String, detail: String, quantity: String, barcode: String) { 
    super.init() 

    self.productcode = productcode 
    self.detail = detail 
    self.quantity = quantity 
    self.barcode = barcode 
} 
} 

そして、ここでは私のOrderViewController.swiftファイルです:

import Foundation 
import UIKit 

//MARK: - Class 
class TestOrderViewController: UITableViewController{ 

required init?(coder decoder: NSCoder) { 
    //print("init OrderViewController") 
    super.init(coder: decoder) 

    loadOrderProducts() 
    } 

    deinit { 
} 

//MARK: - Product Vars 
    var passedProductcode = String()  //String is recieved here! 
    var passedDetail = String()   //String is recieved here! 
    var passedQuantity = String()  //String is recieved here! 
    var passedBarcode = String()   //String is recieved here! 

    var orderProducts = [OrderProduct]() //My Object model... 

//MARK: - ViewDidLoad 
override func viewDidLoad() { 
    super.viewDidLoad() 
    title = "Order List" 

    orderProducts.productcode = passedProductcode //Trying to pass them but 
    orderProducts.detail = passedDetail   //errors with "Value of type 
    orderProducts.quantity = passedQuantity  //'[OrderProduct]' has no 
    orderProducts.barcode = passedBarcode   //member 'productcode'? 

    tableView.estimatedRowHeight = 80.0 
    tableView.rowHeight = UITableViewAutomaticDimension 
    } 

// MARK: - Table view data source 
override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // Return the number of sections. 
    return 1 
} 

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

    return orderProducts.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell", forIndexPath: indexPath) as! OrderTableViewCell 
    let orderProduct = orderProducts[indexPath.row] 
    cell.productcodeLabel.text = orderProduct.productcode 
    cell.detailLabel.text = orderProduct.detail 
    cell.quantityLabel.text = "X \(orderProduct.quantity)" 
    cell.barcodeLabel.text = orderProduct.barcode 

    return cell 
} 

private func loadOrderProducts() { 
    if let filePath = pathForOrderProducts() where NSFileManager.defaultManager().fileExistsAtPath(filePath) { 
     if let archivedOrderProducts = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [OrderProduct] { 
      orderProducts = archivedOrderProducts 
     } 
    } 
} 

private func pathForOrderProducts() -> String? { 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 

    if let documents = paths.first, let documentsURL = NSURL(string: documents) { 
     return documentsURL.URLByAppendingPathComponent("orderProducts.plist").path 
    } 
    return nil 
} 

private func saveOrderProducts() { 
    if let filePath = pathForOrderProducts() { 
     NSKeyedArchiver.archiveRootObject(orderProducts, toFile: filePath) 
     } 
    } 
} 

誰かが私が行方不明です何に私を案内していただけますか?あなたはあなたがOrderProductの配列ではなく、その内部のインスタンスにプロパティ値を取得しようとしている

cell.productcodeLabel.text = orderProducts.productcode //passedProductcode 
cell.detailLabel.text = orderProducts.detail //passedDetail 
cell.quantityLabel.text = "X \(orderProducts.quantity/*passedQuantity*/)" 
cell.barcodeLabel.text = orderProducts.barcode //passedBarcode 

をしようとするときTestOrderViewController

答えて

0

あなたorderProductsプロパティは、そうOrderProductの配列です。

cell.productcodeLabel.text = orderProducts[indexPath.row].productcode //passedProductcode 
cell.detailLabel.text = orderProducts[indexPath.row].detail //passedDetail 
cell.quantityLabel.text = "X \(orderProducts.quantity/*passedQuantity*/)" 
cell.barcodeLabel.text = orderProducts[indexPath.row].barcode //passedBarcode 

しかし、あなたはあなたの配列は、(明らかに)適切なモデルが含まれていることを確認する必要があります。それはおそらく可能必要があります。


[OK]を約束したとおり、私はより完全な例を作成しようとします。これはおそらくあなたの要件100%(これは私にとにかく完全にはっきりとしている)ですが、うまくいけばそれはあなたを途中で得るでしょう...

実際に値を渡している私が示唆しているviewControllerモデルオブジェクトの配列を渡すことになります。これは次のようなものです:

struct ProductModel { 
    var productcode: String 
    var detail: String 
    var quantity: String 
    var barcode: String 
} 

var models = [ProductModel]() 

これで、ProductModelのインスタンスを作成し、これらを配列に追加します。見た目で次のviewController TestOrderViewControllerに移動する準備ができたら、配列全体に渡します(一致するプロパティがあるため)。 これは、viewControllerをプッシュする前に行うか、またはviewControllersの処理方法に基づいてprepareForSegueで行います。私は、私はいくつかの進歩を遂げていますと思いますが、まだかなり存在していないです

// UITableViewDataSource 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return models.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("OrderCell", forIndexPath: indexPath) as! OrderTableViewCell 
    let model = models[indexPath.row] 
    cell.productcodeLabel.text = model.productcode 
    cell.detailLabel.text = model.detail 
    cell.quantityLabel.text = "X \(model.quantity)" 
    cell.barcodeLabel.text = model.barcode 
    return cell 
} 
+0

せorderProduct = orderProducts [indexPath.row] cell.productcodeLabel.text = orderProduct.productcode cell.detailLabel.text = orderProduct.detail cell.quantityLabel.text = "X \(orderProduct.quantity)" cell.barcodeLabel.text = orderProduct.barcode –

+0

ありがとう@ T.Benjamin Larsen、私の問題は実際には、変数を最初にオブジェクトに渡すことで終わりではありません。例:var passedProductcode = String()orderProducts.productcodeにどのように取得しますか? –

+0

できません。 'orderProducts'は' OrderProduct'の_an配列です。これらのプロパティはありません。おそらく、配列にadd_this_という完全なOrderProductInstanceを作成する必要があります。私の目には、それらの「合格した」プロパティは、それほど意味をなさないように見える。 –

0

OK:

はその後 TestOrderViewControllerに、あなたは以下のようなものを持っています。あなたの素晴らしい例のためにT.ベンジャミンラーセンに感謝します。
var quantityTextField = UITextField() 

let product = frc.objectAtIndexPath(indexPath) as! ProductItem //--> Selected cell item. 
var model = models[indexPath.row] //--> fatal error: Index out of range? How do I fix this? 

     model.productcode = product.productcode! // --> This is the row data I want to send. 
     model.detail = product.detail! 
     model.quantity = quantityTextField.text! 
     model.barcode = product.barcode! 

self.performSegueWithIdentifier("addProduct", sender: self) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
if segue.identifier == "addProduct" { 
     print ("Add Item Segue!") 
      let destination = segue.destinationViewController as! OrderViewController 
      destination.selected = models 
      } 
     } 

そしてTestOrderVCで

は、私が持っている:

は、私は次のようしている(送信VC)didSelectRowAtIndexPathで次に

struct ProductModel { 
var productcode: String 
var detail: String 
var quantity: String 
var barcode: String 
} 

var models = [ProductModel]() 

class ProductTableViewController: UITableViewController{ 
} 

私ProductTableViewController上のクラスの次の外に置かれ

class... 
var selected = models 

...numberOfRowsInSection 
return selected.count 

...cellForRowAtIndexPath 

let model = selected[indexPath.row] 
    cell.productcodeLabel.text = model.productcode 
    cell.detailLabel.text = model.detail 
    cell.quantityLabel.text = "X \(model.quantity)" 
    cell.barcodeLabel.text = model.barcode 

現在、致命的なエラーが発生しています。

関連する問題