DEV Community

Cover image for Day 15: Swift macOS password manager for people who hate the cloud
Sean Walker
Sean Walker

Posted on

Day 15: Swift macOS password manager for people who hate the cloud

<- For Day 14 go here

πŸ“… 01/15/2019
πŸš€ 15 days until launch
πŸ”₯ 14 day streak
πŸ’° $4.99 price (this keeps changing)
πŸ€‘ $0 revenue
πŸ“ˆ 0 customers
⌚️ 11.5 hours spent
πŸ’» 20 files changed, 1289 insertions(+), 171 deletions(-)
🏁 Today's goal: Search

1:21 PM
Going to have to start after work again, I really need to start going to bed earlier.

6:50 PM
Alright, back at it, search here we go.

8:14 PM
Took a lot longer than I thought it would. Wait, I'm pretty sure I write that every fricken' time. I managed to figure out a few things that were bothering me today. My custom cell view was not working at all. It just showed the same text cell and nothing else, but it's working now πŸŽ‰ And I got the search working. Check it:

I was curious about memory usage too, I noticed that after I open up every view, and try out a few things like search, adding a new password, it appears to hover around ~28 MB of memory. I feel like that's an improvement over electron πŸ’ͺ. I've aleady spent almost 2 hours on this again tonight. Gotta log off. It was fun though figuring out how to get the search field working, less fun re-doing the table cell view in storyboard (not to mention setting the height in code). Oh speaking of code, here's one way to get a search field and a table view to talk to each other:

    func controlTextDidChange(_ obj: Notification) {
        if obj.object as? NSSearchField == searchField {
            filterWithString(searchField.stringValue)
        }
    }

    func filterWithString(_ searchFieldValue: String) {
        if searchFieldValue.count > 0 {
            logins = rows?.filter { r in
                return (r[login.name]?.lowercased().contains(searchFieldValue.lowercased()))! ||
                    (r[login.username]?.lowercased().contains(searchFieldValue.lowercased()))! ||
                    (r[login.email]?.lowercased().contains(searchFieldValue.lowercased()))!
            }
        } else {
            logins = Array(try! db.prepare(login.table))
        }

        if(logins?.count == 1) {
            tableView.selectRowIndexes(NSIndexSet(index: 0) as IndexSet, byExtendingSelection: false)
        }

        tableView.reloadData()
    }

Oh and don't forget to set the search field's delegate searchField.delegate = self for that controlTextDidChange function. Tune in again tomorrow, same time (more or less), same place.

Top comments (0)