mobile programming using swift programming

csk07
passwordmanager.txt

// // ViewController.swift // Password Manager // import UIKit let BUTTON_SPACING = 10 let BUTTON_HEIGHT = 40 class ViewController: UIViewController { @IBOutlet weak var webField: UITextField! @IBOutlet weak var passField: UITextField! @IBOutlet weak var AddButton: UIButton! @IBOutlet weak var scrollView: UIScrollView! var fileURL = NSURL() var dict = [String : String]() var ButtonArray : [UIButton] = [] var InfoArray : [UIButton] = [] @IBAction func clearAll(sender: AnyObject) { dict.removeAll() ButtonArray.removeAll() InfoArray.removeAll() //NSKeyedArchiver.archiveRootObject(dict, toFile: fileURL.path!) do { let data = try NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false) try data.write(to: fileURL as URL) } catch { print("Couldn't write file") } refreshList() } @IBAction func AddPassword(sender: AnyObject) { //dict["http://www.abc.com"]="123" //dict["http://www.tamuc.org"]="leo" webField.resignFirstResponder() passField.resignFirstResponder() let key: String = webField.text! let value: String = passField.text! if value.count == 0 || key.count == 0 { return } // exit from the method if dict[key] == nil { // test if the website is not in Dictionary yet dict[key] = value } else { // if not, overrode } // add a new entry in tags webField.text = "http://www." // clear tagField of text passField.text = nil do { let data = try NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false) try data.write(to: fileURL as URL) } catch { print("Couldn't write file") } print("saved") addNewButtonWithTitle(title: key) } // create a new button programmatically @objc func buttonTouched(sender: UIButton) { let urlString: String = sender.titleLabel!.text! // get Button's text let url: NSURL = NSURL(string: urlString)! UIApplication.shared.open(url as URL, completionHandler: nil) } func addNewButtonWithTitle(title: String) { let button: UIButton = UIButton() // give the button the title of the tag button.setTitle(title, for: .normal) // for normal //button.titleLabel?.textAlignment = .Left button.backgroundColor = UIColor.darkGray button.layer.borderColor = UIColor.black.cgColor button.layer.borderWidth = 0.5; button.layer.cornerRadius = 10.0; // tell the button to call buttonTouched: when it is touched button.addTarget(self, action: #selector (ViewController.buttonTouched(sender:)) ,for: .touchUpInside) // add the UIButton to the end of the array ButtonArray.append(button) ButtonArray = ButtonArray.sorted { $0.titleLabel!.text! < $1.titleLabel!.text! } let newHeight: Float = Float((ButtonArray.count) * (BUTTON_HEIGHT + BUTTON_SPACING) ) + Float (BUTTON_SPACING) let contentSize: CGSize = CGSize(width: scrollView.frame.size.width, height: CGFloat(newHeight)) scrollView.contentSize = contentSize refreshList() } @objc func infoButtonTouched(sender: UIButton) { // get the index of the button that was touched let index: Int = InfoArray.index(of: sender)! // get the title of the button let key: String = ButtonArray[index].titleLabel!.text! webField.text = key let value: String = dict[key]! passField.text = value // update queryField with the value } func refreshList() { // remove all the buttons from the GUI let subviews = scrollView.subviews as [UIView] for v in subviews { if let button = v as? UIButton { button.removeFromSuperview() } } InfoArray.removeAll() var buttonOffset: CGFloat = CGFloat(BUTTON_SPACING) // reset the spacing // repopulate the scroll view with buttons for button: UIButton in ButtonArray { var buttonFrame: CGRect = button.frame // fetch the frame of button buttonFrame.origin.x = CGFloat(BUTTON_SPACING) // set the x-coordinate buttonFrame.origin.y = buttonOffset // set the y-coordinate // button width is the size of the view minus padding on each side buttonFrame.size.width = 300 buttonFrame.size.height = CGFloat(BUTTON_HEIGHT) // set the height of button button.frame = buttonFrame // assign the new frame to button print("X:", BUTTON_SPACING, " Y:", buttonOffset, " W: ", buttonFrame.size.width, " H: ", BUTTON_HEIGHT) scrollView.addSubview(button) let infoButton: UIButton = UIButton(type: .detailDisclosure) InfoArray.append(infoButton) // position button to the right of the button we just added buttonFrame = infoButton.frame // fetch the frame of infoButton buttonFrame.origin.x = 340 // this button is a bit shorter than normal buttons, so we adjust buttonFrame.origin.y = buttonOffset + 10 infoButton.frame = buttonFrame // assign the new frame // make the button call infoButtonTouched: when it is touched // infoButton.addTarget(self, action: Selector("infoButtonTouched(_:)"), forControlEvents: .TouchUpInside) infoButton.addTarget(self, action:#selector(ViewController.infoButtonTouched(sender:)), for: .touchUpInside) scrollView.addSubview(infoButton) buttonOffset += CGFloat(BUTTON_HEIGHT + BUTTON_SPACING) } } override func viewDidLoad() { super.viewDidLoad() let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] print(documentsURL) fileURL = documentsURL.appendingPathComponent("passwords.plist") as NSURL let fileManager = FileManager.default //check if file exists if(!fileManager.fileExists(atPath: fileURL.path!)) { print("passwords.plist is not found with filemanager") do { let data = try NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false) try data.write(to: fileURL as URL) } catch { print("Couldn't write file") } } else // file is found, no need to { // read from file do { let dict_data = try Data(contentsOf: fileURL as URL) print(dict_data) do { dict = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dict_data) as! [String : String] } catch { print("Couldn't read file.") } } catch { print("Couldn't open data file.") } print(dict.count, " passwords found ") for pair in dict { print(String(pair.0) + " for " + (pair.1)) // for console output addNewButtonWithTitle(title: String(pair.0)) } } webField.text = "http://www." } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }