在tableview中搜索分成多个数组的数据库数据?

问题描述 投票:1回答:1

我是Swift语言和iOS平台上的新开发人员。我一直在阅读许多关于在表格中实现搜索功能的指南和教程。

但是,没有一个能比得上我的需要。所以,我的问题是:我将如何实现搜索包含数据库数据的表并从4个数组中填充?

表格的代码

import UIKit

class VieworderTVC: UIViewController,UITableViewDataSource, UITableViewDelegate  {   

    var deleteOrderIndexPath: NSIndexPath? = nil

    @IBAction func btnRefresh(sender: UIBarButtonItem) {


            orderIDData.removeAll()
            ItemNoData.removeAll()
            BPnoData.removeAll()
            QuantityData.removeAll()
            self.tblview.reloadData()
            get_data_from_url("http://100.1.1.25/sfc/orders.php")

            return
    }

    @IBOutlet weak var tblview: UITableView!;

    var orderIDData:Array< String > = Array < String >()
    var ItemNoData:Array< String > = Array < String >()
    var BPnoData:Array< String > = Array < String >()
    var QuantityData:Array< String > = Array < String >()

    override func viewDidLoad() {
        super.viewDidLoad()
        get_data_from_url("http://100.1.1.25/sfc/orders.php")

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

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return orderIDData.count
    }

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

        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! OrderViewCell
        print(indexPath.row)
        cell.orderLabel.text = orderIDData[indexPath.row]
        cell.lblitem.text = ItemNoData[indexPath.row]
        cell.lblbp.text = BPnoData[indexPath.row]
        cell.lblquantity.text = QuantityData[indexPath.row]
        return cell
    }

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            deleteOrderIndexPath = indexPath
            let OrderToDelete = orderIDData[indexPath.row]
            confirmDelete(OrderToDelete)
        }
    }

    // Delete Confirmation and Handling
    func confirmDelete(planet: String) {
        let alert = UIAlertController(title: "Delete Planet", message: "Are you sure you want to permanently delete order \(planet)?", preferredStyle: .ActionSheet)

        let DeleteAction = UIAlertAction(title: "Delete", style: .Destructive, handler: handleDeletePlanet)
        let CancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: cancelDeleteOrder)

        alert.addAction(DeleteAction)
        alert.addAction(CancelAction)

        self.presentViewController(alert, animated: true, completion: nil)
    }

    func handleDeletePlanet(alertAction: UIAlertAction!) -> Void {
        if let indexPath = deleteOrderIndexPath {
            tblview.beginUpdates()

            let OrderNo = orderIDData[indexPath.row];


            let myUrl = NSURL(string: "http://100.1.1.25/sfc/deleteorder.php");let request = NSMutableURLRequest(URL:myUrl!);
            request.HTTPMethod = "POST";

            // Compose a query string

            let postString = "OrderNo=\(OrderNo)";

            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
                data, response, error in

                if error != nil
                {
                    print("error=\(error)")
                    return
                }

                // You can print out response object
                print("response = \(response)")

                // Print out response body
                let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("responseString = \(responseString)")

                //Let’s convert response sent from a server side script to a NSDictionary object:

                //var err: NSError?
                let myJSON = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary

                if let parseJSON = myJSON {
                    let resultValue = parseJSON["status"] as? String!;

                    print("result: \(resultValue)");
                    var isOrderDeleted:Bool = false;

                    if (resultValue == "Success") {isOrderDeleted = true;}

                    var DisplayMessage: String = parseJSON["message"] as! String!;
                    if (!isOrderDeleted) {
                        DisplayMessage = parseJSON["message"] as! String!
                    }


                    dispatch_async(dispatch_get_main_queue(), {
                        let alerting = UIAlertController(title:"Alert", message:DisplayMessage, preferredStyle: UIAlertControllerStyle.Alert);

                        let ok = UIAlertAction(title: "Ok", style:UIAlertActionStyle.Default, handler: nil)

                        alerting.addAction(ok);
                        self.presentViewController(alerting, animated: true, completion: nil)
                    });


                }

            }

            task.resume()


            orderIDData.removeAtIndex(indexPath.row)
            ItemNoData.removeAtIndex(indexPath.row)
            BPnoData.removeAtIndex(indexPath.row)
            QuantityData.removeAtIndex(indexPath.row)

            // Note that indexPath is wrapped in an array:  [indexPath]
            tblview.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

            deleteOrderIndexPath = nil

            tblview.endUpdates()
        }
    }

    func cancelDeleteOrder(alertAction: UIAlertAction!) {
        deleteOrderIndexPath = nil
    }


    func get_data_from_url(url:String)
    {
        let httpMethod = "GET"

        let url = NSURL(string: url)
        let urlRequest = NSMutableURLRequest(URL: url!,
            cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData,
            timeoutInterval: 15.0)
        let queue = NSOperationQueue()
        NSURLConnection.sendAsynchronousRequest(
            urlRequest,
            queue: queue,
            completionHandler: {(response: NSURLResponse?,
                data: NSData?,
                error: NSError?) in
                if data!.length > 0 && error == nil{
                    let json = NSString(data: data!, encoding: NSASCIIStringEncoding)
                    self.extract_json(json!)
                }else if data!.length == 0 && error == nil{
                    print("Nothing was downloaded")
                } else if error != nil{
                    print("Error happened = \(error)")
                }
            }
        )
    }

    func extract_json(data:NSString)
    {
        //let parseError: NSError?
        let jsonData:NSData = data.dataUsingEncoding(NSASCIIStringEncoding)!
        let json: AnyObject? = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

            if let orders_list = json as? NSArray
            {
                for (var i = 0; i < orders_list.count ; i++ )
                {
                    if let orders_obj = orders_list[i] as? NSDictionary
                    {
                        if let order_id = orders_obj["OrderID"] as? String
                        {

                            if let order_ItemNo = orders_obj["ItemNo"] as? String
                            {
                                if let order_bpNo = orders_obj["BPno"] as? String
                                {
                                    if let order_quantity = orders_obj["Quantity"] as? String
                                    {
                                    //TableData.append(order_id + " [" + order_ItemNo + "]")

                                    orderIDData.append(order_id)
                                    ItemNoData.append(order_ItemNo)
                                    BPnoData.append(order_bpNo)
                                    QuantityData.append(order_quantity)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        do_table_refresh();
    }


    func do_table_refresh()
    {
        dispatch_async(dispatch_get_main_queue(), {
            self.tblview.reloadData()
            return
        })
    }

细胞代码

import UIKit

class OrderViewCell: UITableViewCell {

  @IBOutlet weak var orderLabel: UILabel!
  @IBOutlet weak var lblitem: UILabel!

  @IBOutlet weak var lblquantity: UILabel!
  @IBOutlet weak var lblbp: UILabel!

}
ios swift uitableview uisearchbar
1个回答
0
投票

我设法通过以下方式解决了这个问题:

import UIKit

extension UITableViewCell {
    func setTransparent() {
        let bgView: UIView = UIView()
        bgView.backgroundColor = .clearColor()

        self.backgroundView = bgView
        self.backgroundColor = .clearColor()
    }
}

class VieworderTVC: UIViewController,UITableViewDataSource, UITableViewDelegate {

    var manualBP = ""

    var deleteOrderIndexPath: NSIndexPath? = nil

    @IBAction func btnRefresh(sender: UIBarButtonItem) {


            orderIDData.removeAll()
            ItemNoData.removeAll()
            BPnoData.removeAll()
            QuantityData.removeAll()
            self.tblview.reloadData()
            get_data_from_url("http://x.x.x/sfc/orders.php")

            return
    }



    @IBAction func filterOrder(sender: AnyObject) {
        // 1
        let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)

        // 2
        let BPAction = UIAlertAction(title: "Filter by BP number", style: .Default, handler: {
            (alert: UIAlertAction!) -> Void in

//            let alertController = UIAlertController(title: "How to enter BP number?", message: nil, preferredStyle: UIAlertControllerStyle.Alert)
//            
//            
//            let manEnt = UIAlertAction(title: "Manual", style: UIAlertActionStyle.Default, handler: {(alert :UIAlertAction!) in



                //1. Create the alert controller.
                let alert = UIAlertController(title: "BP number entry", message: "Enter the BP number:", preferredStyle: .Alert)

                //2. Add the text field. You can configure it however you need.
                alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
                    textField.text = ""
                })

                //3. Grab the value from the text field
                alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in

                    let textField = alert.textFields![0] as UITextField

                    self.manualBP = textField.text!

                    if(textField.text != "" && (textField.text?.characters.count)! > 10 && self.BPnoData.contains(self.manualBP)){
                        print("Text field: \(textField.text!)")



                        //going to attempt to remove the orders that dont match bp number entered
                        var repcount: Int = 0;

                        repeat{

                            if(self.BPnoData[repcount] != self.manualBP) {

                                self.orderIDData.removeAtIndex(repcount)
                                self.ItemNoData.removeAtIndex(repcount)
                                self.BPnoData.removeAtIndex(repcount)
                                self.QuantityData.removeAtIndex(repcount)


                                //i = 0;
                        } else {
                                repcount++
                            }

                        }while (repcount < self.orderIDData.count)

//                        for (var i = 0; i < self.orderIDData.count + 1; i++ ) {
//                            if(self.BPnoData[i] != self.manualBP) {
//                               
//                                self.orderIDData.removeAtIndex(i)
//                                self.ItemNoData.removeAtIndex(i)
//                                self.BPnoData.removeAtIndex(i)
//                                self.QuantityData.removeAtIndex(i)
//                                
//                                
//                                //i = 0;
//                            }
//                            print(i)
//                            
//                        }
                        self.tblview.reloadData()

                    } else if (textField.text == "") {
                        alert.title = "No bp number entered!"
                        alert.message = "Blank entry not allowed!"
                        self.presentViewController(alert, animated: true, completion: nil)

                   } else if ((textField.text?.characters.count)! < 6) {
                        alert.title = "BP number entered is too short!"
                        alert.message = "Please try again!"
                        self.presentViewController(alert, animated: true, completion: nil)
                    }else if ((textField.text?.characters.count)! > 43) {
                        alert.title = "BP number entered is too long!"
                        alert.message = "Please try again!"
                        self.presentViewController(alert, animated: true, completion: nil)
                    }else if (!self.BPnoData.contains(self.manualBP)) {
                        alert.title = "BP number entered is not a valid one!"
                        alert.message = "Please try again!"
                        self.presentViewController(alert, animated: true, completion: nil)
                    }

                }))

                let noAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: nil)
                alert.addAction(noAction)

                // 4. Present the alert.
                self.presentViewController(alert, animated: true, completion: nil)



            //})
            //alertController.addAction(manEnt)


//            let okAction = UIAlertAction(title: "By Scan", style: UIAlertActionStyle.Default, handler: {(alert :UIAlertAction!) in
//               
//                self.performSegueWithIdentifier("byscan", sender: self)
//            })
//            alertController.addAction(okAction)

//            let noAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: nil)
//            alertController.addAction(noAction)
//            
//            self.presentViewController(alertController, animated: true, completion: nil)

        })


        let saveAction = UIAlertAction(title: "Clear Filter", style: .Default, handler: {
            (alert: UIAlertAction!) -> Void in

            self.orderIDData.removeAll()
            self.ItemNoData.removeAll()
            self.BPnoData.removeAll()
            self.QuantityData.removeAll()
            self.tblview.reloadData()
            self.get_data_from_url("http://x.x.x/sfc/orders.php")

        })

        //
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
            (alert: UIAlertAction!) -> Void in
            print("Cancelled");
        })


        // 4
        optionMenu.addAction(BPAction)
        optionMenu.addAction(saveAction)
        optionMenu.addAction(cancelAction)

        // 5
        self.presentViewController(optionMenu, animated: true, completion: nil)

    }



    @IBOutlet weak var tblview: UITableView!;

    var orderIDData:Array< String > = Array < String >()
    var ItemNoData:Array< String > = Array < String >()
    var BPnoData:Array< String > = Array < String >()
    var QuantityData:Array< String > = Array < String >()

    var filteredOrder = [orderitem]()

    override func viewDidLoad() {
        super.viewDidLoad()
        get_data_from_url("http://x.x.x/sfc/orders.php")

        tblview.tableFooterView = UIView(frame:CGRectZero)

        tblview.backgroundColor = .clearColor()
        // 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

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return orderIDData.count
    }

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

        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! OrderViewCell
        //print(indexPath.row)
        cell.orderLabel.text = orderIDData[indexPath.row]
        cell.lblitem.text = ItemNoData[indexPath.row]
        cell.lblbp.text = BPnoData[indexPath.row]
        cell.lblquantity.text = QuantityData[indexPath.row]

        //cell.backgroundColor = UIColor.clearColor()

        cell.setTransparent()

        return cell
    }

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            deleteOrderIndexPath = indexPath
            let OrderToDelete = orderIDData[indexPath.row]
            confirmDelete(OrderToDelete)
        }
    }

    // Delete Confirmation and Handling
    func confirmDelete(planet: String) {
        let alert = UIAlertController(title: "Delete Order", message: "Are you sure you want to permanently delete order \(planet)?", preferredStyle: .ActionSheet)

        let DeleteAction = UIAlertAction(title: "Delete", style: .Destructive, handler: handleDeletePlanet)
        let CancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: cancelDeleteOrder)

        alert.addAction(DeleteAction)
        alert.addAction(CancelAction)

        self.presentViewController(alert, animated: true, completion: nil)
    }

    func handleDeletePlanet(alertAction: UIAlertAction!) -> Void {
        if let indexPath = deleteOrderIndexPath {
            tblview.beginUpdates()

            let OrderNo = orderIDData[indexPath.row];


            let myUrl = NSURL(string: "http://x.x.x/sfc/deleteorder.php");let request = NSMutableURLRequest(URL:myUrl!);
            request.HTTPMethod = "POST";

            // Compose a query string

            let postString = "OrderNo=\(OrderNo)";

            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
                data, response, error in

                if error != nil
                {
                    print("error=\(error)")
                    return
                }

                // You can print out response object
                print("response = \(response)")

                // Print out response body
                let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("responseString = \(responseString)")

                //Let’s convert response sent from a server side script to a NSDictionary object:

                //var err: NSError?
                let myJSON = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary

                if let parseJSON = myJSON {
                    let resultValue = parseJSON["status"] as? String!;

                    print("result: \(resultValue)");
                    var isOrderDeleted:Bool = false;

                    if (resultValue == "Success") {isOrderDeleted = true;}

                    var DisplayMessage: String = parseJSON["message"] as! String!;
                    if (!isOrderDeleted) {
                        DisplayMessage = parseJSON["message"] as! String!
                    }


                    dispatch_async(dispatch_get_main_queue(), {
                        let alerting = UIAlertController(title:"Alert", message:DisplayMessage, preferredStyle: UIAlertControllerStyle.Alert);

                        let ok = UIAlertAction(title: "Ok", style:UIAlertActionStyle.Default, handler: nil)

                        alerting.addAction(ok);
                        self.presentViewController(alerting, animated: true, completion: nil)
                    });


                }

            }

            task.resume()


            orderIDData.removeAtIndex(indexPath.row)
            ItemNoData.removeAtIndex(indexPath.row)
            BPnoData.removeAtIndex(indexPath.row)
            QuantityData.removeAtIndex(indexPath.row)

            // Note that indexPath is wrapped in an array:  [indexPath]
            tblview.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)

            deleteOrderIndexPath = nil

            tblview.endUpdates()
        }
    }

    func cancelDeleteOrder(alertAction: UIAlertAction!) {
        deleteOrderIndexPath = nil
    }


    func get_data_from_url(url:String)
    {
//        let httpMethod = "GET"
//        
//        let url = NSURL(string: url)
//        let urlRequest = NSMutableURLRequest(URL: url!,
//            cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData,
//            timeoutInterval: 15.0)
//        let queue = NSOperationQueue()
//        NSURLConnection.sendAsynchronousRequest(
//            urlRequest,
//            queue: queue,
//            completionHandler: {(response: NSURLResponse?,
//                data: NSData?,
//                error: NSError?) in
//                if data!.length > 0 && error == nil{
//                    let json = NSString(data: data!, encoding: NSASCIIStringEncoding)
//                    self.extract_json(json!)
//                }else if data!.length == 0 && error == nil{
//                    print("Nothing was downloaded")
//                } else if error != nil{
//                    print("Error happened = \(error)")
//                }
//            }
//        )


        let url : NSURL = NSURL(string: url)!
        let request: NSURLRequest = NSURLRequest(URL: url)
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)

        let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in

            let json = NSString(data: data!, encoding: NSASCIIStringEncoding)
            self.extract_json(json!)

        });

        task.resume()

    }

    func extract_json(data:NSString)
    {
        //let parseError: NSError?
        let jsonData:NSData = data.dataUsingEncoding(NSASCIIStringEncoding)!
        let json: AnyObject? = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

            if let orders_list = json as? NSArray
            {
                for (var i = 0; i < orders_list.count ; i++ )
                {
                    if let orders_obj = orders_list[i] as? NSDictionary
                    {
                        if let order_id = orders_obj["OrderID"] as? String
                        {

                            if let order_ItemNo = orders_obj["ItemNo"] as? String
                            {
                                if let order_bpNo = orders_obj["BPno"] as? String
                                {
                                    if let order_quantity = orders_obj["Quantity"] as? String
                                    {
                                    //TableData.append(order_id + " [" + order_ItemNo + "]")

                                    orderIDData.append(order_id)
                                    ItemNoData.append(order_ItemNo)
                                    BPnoData.append(order_bpNo)
                                    QuantityData.append(order_quantity)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        do_table_refresh();
    }


    func do_table_refresh()
    {
        dispatch_async(dispatch_get_main_queue(), {
            self.tblview.reloadData()
            return
        })
    }


    /*
    // Override to support conditional editing of the table view.
    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return NO if you do not want the specified item to be editable.
        return true
    }
    */

    /*
    // Override to support editing the table view.
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            // Delete the row from the data source
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        } else if editingStyle == .Insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }    
    }
    */

    /*
    // Override to support rearranging the table view.
    override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {

    }
    */

    /*
    // Override to support conditional rearranging of the table view.
    override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // Return NO if you do not want the item to be re-orderable.
        return true
    }
    */

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

}

以下是Tom Elliot提供的精彩教程的链接:

https://www.raywenderlich.com/157864/uisearchcontroller-tutorial-getting-started

© www.soinside.com 2019 - 2024. All rights reserved.