2016-06-17 3 views
0

아주 간단한 제품 주문 응용 프로그램을 구축 중입니다. 이 탭된 응용 프로그램, 제품 목록, 주문 목록 및 설정입니다. 제품 목록 (원격 csv 파일에서 구문 분석 한 coredata)에서 검색 한 다음 행을 선택한 다음 원하는 양을 텍스트 필드에 추가 한 경고보기를 표시 한 다음 alertview의 "ADD"단추를 클릭하여 네 개의 문자열 Productcode, Detail, Quantity (alertview에서) 및 바코드)를 Order List View 컨트롤러에 전송합니다. 여기가 문제가있는 곳입니다! OrderList에 의해 수신되는 시점에 콘솔에 네 개의 문자열을 인쇄 할 수는 있지만 이러한 문자열을 내 NSObject 모델에 전달하여 tableviewcell의 레이블에 표시하고 유지할 수있는 방법이 필요합니다.다른 tableviewcontroller에서받은 문자열을 전달하십시오.

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.swift 파일입니다? 당신은 당신은 오히려 내부의 경우보다 더 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 

을 할 때

답변

0

TestOrderViewController에 대한 여러분의 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 

그러나 당신은 당신의 배열이 적절한 모델 (분명히)이 포함되어 있는지 확인해야합니다.


좋아요, 나는 더 완전한 예를 만들려고합니다. 이것은 아마도 귀하의 요구 사항과 100 % 일치하지 않을 것입니다. (어쨌든 나에게 분명히 나와 있습니다.)하지만 잘하면 그것은 당신을 방해하지 않을 것입니다 ...

실제로 가치를 전달하는 곳에서 나는 제안 할 것입니다 차라리 일련의 모델 객체를 전달한다는 것입니다. 이것은 다음과 같을 수 있습니다 :

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

var models = [ProductModel]() 

그러면 ProductModel 인스턴스를 크립하고 배열에 추가합니다. 보이는대로 다음 viewController TestOrderViewController로 이동할 준비가되면 일치하는 속성이 있으므로 전체 배열을 전달합니다. 이 작업은 viewController를 푸시하기 전에 수행하거나 prepareForSegue에서 viewController를 처리하는 방법에 따라 수행됩니다. 그래서 내가 어떤 진전하고 있다고 생각하지만, 아직 확실히이 아니다

// 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, 제 문제는 실제로 변수를 객체에 처음 전달하는 것과 같습니다. 예 : passedProductcode = String() orderProducts.productcode로 가져 오려면 어떻게해야합니까? –

+0

수 없습니다. 'orderProducts'는'OrderProduct'의 _an 배열입니다.이 속성에는 이러한 속성이 없습니다. 배열에 전체 OrderProductInstance를 추가해야 할 수도 있습니다. 내 눈에는 그 '통과 ...'속성이 그다지 의미가없는 것처럼 보입니다. –

0

OK :

그런 다음 TestOrderViewController에서 당신은 다음과 같은 것을해야합니다. 환상적인 예를 들어 주신 T. Benjamin Larsen에게 감사드립니다.
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 

현재 치명적인 오류가 발생했습니다.