传入从另一个tableviewcontroller接收的字符串

时间:2016-06-17 03:03:49

标签: swift string uitableview nsobject nscoding

我正在构建一个非常简单的产品订购应用程序。 这是一个选项卡式应用程序,即产品列表,订单列表和设置。 从产品列表(从远程csv文件解析的coredata),我可以搜索然后选择一行,然后弹出一个警报视图,将所需的数量添加到文本字段,然后在" ADD" alertview中的按钮我可以将四个字符串(Productcode,Detail,Quantity(来自alertview)和条形码)转换为Order List View控制器。 这是我遇到麻烦的地方! 我可以在OrderList收到的时候在控制台中打印这四个字符串,但我仍然坚持将这些字符串传递给My NSObject模型,以便在tableviewcell的标签中显示和保存它们。 / p>

这是我的OrderProduct.swift文件:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<aside id="app-aside" class="app-aside top light">
    <div class="container">
        <div class="aside-menu-wrapper">
            <div id="aside-top-menu-toggle" class="visible-xs-inline-block">
                <button data-toggle="class" data-target="#aside-top-menu" data-class="open" self-toggle="is-active" class="hamburger hamburger--spin js-hamburger" type="button">
                    <span class="hamburger-box">
                        <span class="hamburger-inner"></span>
                    </span>
                </button>
            </div>
            <ul class="sf-menu aside-menu aside-top-menu" id="aside-top-menu">
                <li>
                    <a href="#" class="menu-link" data-module="planning">
                        <span class="menu-text">Planning</span>
                    </a>
                </li>
                <li>
                    <a href="#" class="menu-link">
                        <span class="menu-text">Rooms <i class="zmdi zmdi-caret-down"></i></span>
                    </a>
                    <ul>
                        <li><a href="#" data-module="rooms-list">List rooms</a></li>
                        <li><a href="#" data-module="rooms-create">Create a room</a></li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</aside>

这是我的OrderViewController.swift文件:

    var app=angular.module('appName', []);
    app.config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('[[');
    $interpolateProvider.endSymbol(']]');
    }); 

有人可以指导我找到我错过的东西吗?

2 个答案:

答案 0 :(得分:0)

orderProducts中的TestOrderViewController属性是一个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

您尝试检索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%符合您的要求(无论如何这对我来说都是完全清楚的),但希望它能让您顺利上路......

在实际传递值的viewController中,我建议你传递一个模型对象数组。这可能是这样的:

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

var models = [ProductModel]()

因此,您将创建ProductModel的实例并将其附加到数组中。当你准备好通过它的外观移动到下一个viewController TestOrderViewController时,你将把整个数组传递给它(因为它将具有匹配的属性)。 这将在您推送viewController之前完成,或者在prepareForSegue中根据您处理viewControllers的方式完成。

然后在TestOrderViewController中你会得到类似下面的内容:

// 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
}

答案 1 :(得分:0)

好的,所以我觉得我正在取得一些进展,但还没到那里。谢谢T. Benjamin Larsen的杰出榜样。

我在课堂外放置了我的ProductTableViewController(发送VC)

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

var models = [ProductModel]()

class ProductTableViewController: UITableViewController{
}

然后在didSelectRowAtIndexPath中我有以下内容:

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中我有:

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

我目前遇到致命错误。