ios - 如何在 swift NSMutableArray 中基于其他元素获取一个元素的所有值

标签 ios xcode swift nsmutablearray nsmutabledictionary

我想从Swift 语言NSMutableArray 中获取部门名称为“Internal Medicine.\n”的所有医生姓名。

    (
 {
     DepartmentName = "Internal Medicine.\n ";
     DoctorName = "Dr. A. K. Kundu\n ";
 },
 {
     DepartmentName = "Internal Medicine.\n ";
     DoctorName = "Dr. Arvind K. Minz\n ";
 },
 {
     DepartmentName = "Internal Medicine.\n ";
     DoctorName = "Dr. Rajeev Choudhary\n ";
 },
 {
     DepartmentName = "Obstetrics And Gynaecology.\n ";
     DoctorName = "Dr. Gouri Jain\n ";
 },
 {
     DepartmentName = "Obstetrics And Gynaecology.\n ";
     DoctorName = "Dr. Poonam Kataria\n ";
 },
 {
     DepartmentName = "Obstetrics And Gynaecology.\n ";
     DoctorName = "Dr. Ila Jha\n ";
 },
 {
     DepartmentName = "Internal Medicine.\n ";
     DoctorName = "Dr. Ram Niwas Gupta\n ";
 },
 {
     DepartmentName = "Gasteroenterology.\n ";
     DoctorName = "Dr. Sanjay Kumar\n ";
 },
 {
     DepartmentName = "Neurology.\n ";
     DoctorName = "Dr. Sameer Gupta\n ";
 },
 {
     DepartmentName = "Physiotherapy And Rehabilitation.\n ";
     DoctorName = "Dr. Kapil Chauhan\n ";
 },
 {
     DepartmentName = "X­Ray.\n ";
     DoctorName = "Dr. Gagan Sharma\n ";
 }
)

我可以使用 valueforkey(例如 posts.valueForKey("DoctorName") 或 posts.valueForKey("Departmentname") 轻松获取所有部门和医生姓名) 和现在我想获取从部门列表中选择部门名称的所有医生姓名

我的完整代码:

import UIKit
import ActionSheetPicker_3_0

class SearchController: UIViewController, NSXMLParserDelegate, UISearchBarDelegate , UITableViewDelegate , UITableViewDataSource {


    @IBOutlet weak var selectDepartmentView: UIButton!
    @IBOutlet weak var selectDoctorView: UIButton!

    var parser = NSXMLParser()
    var posts = NSMutableArray()
    var DoctorArray = NSMutableArray()
    var DepartmentArray = NSMutableArray()
    var DoctorArrayAsDepartment = NSMutableArray()
    var elements = NSMutableDictionary()
    var element = NSString()
    var nsArray = NSMutableString()
    var nsArray2 = NSMutableString()
    var PickValue=""
    //=======search bar============
    var searchActive : Bool = false
    var filtered:[String] = []
    //======search Bar===============
    var nonMutableArray:[String] = []

    @IBOutlet weak var searchBar: UISearchBar!

    @IBOutlet weak var tableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // self.GetDeartmentsListParsing()
        self.GetDocotorListParsing()


        // Do any additional setup after loading the view.
        searchBar.delegate = self
        tableView.delegate = self
        tableView.dataSource = self

        tableView.tableFooterView = UIView(frame: CGRectZero)
    }


    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchActive = true;
    }

    func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchActive = false;
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        searchActive = false;
    }

    func searchBarSearchButtonClicked(searchBar: UISearchBar) {
        searchActive = false;
    }

    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

        filtered = nonMutableArray.filter({ (text) -> Bool in
            let tmp: NSString = text
            let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
            return range.location != NSNotFound
        })
        if(filtered.count == 0){
            searchActive = false;
        } else {
            searchActive = true;
        }
        self.tableView.reloadData()
        println("searchText:" + searchText)
       // searchBar.text = filtered[indexPath.row]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(searchActive) {
            return filtered.count
        }
        return nonMutableArray.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell;
        if(searchActive){
            cell.textLabel?.text = filtered[indexPath.row]
        } else {
            cell.textLabel?.text = nil
           // nonMutableArray.removeAll()
        }

        return cell;
    }


    func GetDocotorListParsing()
    {
        posts = []
        parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://13.192.12.86:201/Api_interfaceTest.aspx?opname=something&PassKey=xyz")))
        parser.delegate = self
        parser.parse()

        println("into GetDoctorListParsing")
    }


    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
    {
        element = elementName
        if (elementName as NSString).isEqualToString("ReturnTable")
        {
            elements = NSMutableDictionary()
            elements = [:]

             nsArray = NSMutableString()
             nsArray = ""

             nsArray2 = NSMutableString()
             nsArray2 = ""
        }
    }

    func parser(parser: NSXMLParser!, foundCharacters string: String!)
    {

        if element.isEqualToString("Departmentname") {
            nsArray.appendString(string) // nsArray is NSMutableString
        }
       else if element.isEqualToString("PersonFullName") {
            nsArray2.appendString(string)

        }

    }

    func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!)
    {
        if (elementName as NSString).isEqualToString("Departmentname") {
            if !nsArray.isEqual(nil) {
                elements.setObject(nsArray, forKey: "DepartmentName")

            }
            if !nsArray2.isEqual(nil) {
                elements.setObject(nsArray2, forKey: "DoctorName")
            }
            posts.addObject(elements)
          // ===== This is the posts array i gave output above ===

            let myArrayDepartment = (posts.valueForKey("DepartmentName") as? [String])
            DepartmentArray = NSMutableArray(array: myArrayDepartment!)
            println(DepartmentArray)


            let myArrayDoctor = posts.valueForKey("DoctorName") as? [String]
            DoctorArray = NSMutableArray(array: myArrayDoctor!)
            println(DoctorArray)
            nonMutableArray = DoctorArray as AnyObject as [String]

        }
            }

    @IBAction func SelectDoctorButton(sender: AnyObject) {

                    // Inside a IBAction method:
                // Create an array of strings you want to show in the picker:
        searchActive = false;
        ActionSheetMultipleStringPicker.showPickerWithTitle("Select Department", rows: [
            DepartmentArray], initialSelection: [1], doneBlock: {
                picker, values, indexes in

                print("values = \(values)")
                print("indexes = \(indexes)")
                print("picker = \(picker)")

                var firstValue: AnyObject! = indexes[0]

                self.PickValue = firstValue as String

               self.selectDepartmentView.setTitle(firstValue as? String, forState: UIControlState.Normal)

                for var i=0 ; i<10 ; i++ {
                    let indexes = (self.posts.valueForKey("DepartmentName"))?.indexOfObject(self.PickValue)
                    // println("@@@@@sucess@@@@" +  index)
                    NSLog("\(indexes)")
                    //  find(posts.valueForKey("DepartmentName")),"")

                }

                return

            }, cancelBlock: { ActionMultipleStringCancelBlock in return }, origin: sender)

        // You can also use self.view if you don't have a sender

    }

    @IBAction func SelectDoctor(sender: AnyObject) {

         tableView.reloadData()
         searchActive = false;

        ActionSheetMultipleStringPicker.showPickerWithTitle("Select Doctor", rows: [
            DoctorArray,

            ], initialSelection: [1, 1], doneBlock: {
                picker, values, indexes in

                print("values = \(values)")
                print("indexes = \(indexes)")
                print("picker = \(picker)")

                var firstValue: AnyObject! = indexes[0]

                self.PickValue = firstValue as String
                  self.selectDoctorView.setTitle(firstValue as? String, forState: UIControlState.Normal)
                return
            }, cancelBlock: { ActionMultipleStringCancelBlock in return }, origin: sender)


    }

    // Build in Methode
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

        self.view.endEditing(true)

        }
}

最佳答案

我建议你创建一个名为 Doctor 的新对象

class Doctor: NSObject {

    var doctorName = ""
    var departmentName = ""
}

这样您就可以轻松地将数据解析为新的 Doctor 并将其像数组一样存储。过滤、查找或做任何事情都会更容易。

希望对您有所帮助。

关于ios - 如何在 swift NSMutableArray 中基于其他元素获取一个元素的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33296216/

相关文章:

ios - 我的自定义键盘无法共享数据,因为 filecoordinationd 崩溃(在设备上)

ios - OpenGL 渲染在 App Backgrounded 后不恢复

swift - 如何以编程方式设置 Collection View 的大小

iphone - 计算沿 y 轴方向(角度测量)的变化率?

ios - 如何在 TableView 中显示 Firebase 数据?

ios - 如何在 SWRevealViewController 中切换前 View Controller 顶部的后 View Controller 动画?

android - 在没有互联网的情况下唤醒锁定的手机

xcode - 在 UIViewControllerRepresentable 中传递数据

ios - 预加载 UIWebView

swift - Swift 中运算符重载的多态性