From aecc3a9d0378c01ba1272f0ed37b18b3f7db98ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Hu=CC=88hne?= Date: Sun, 10 Mar 2019 11:29:26 +0100 Subject: [PATCH] #48 added inputAccessoryView to the bookmark view keyboard to navigate between text fields --- .../Bookmarks/BookmarkViewController.swift | 49 ++++++++++++++++++ .../arrow-down.imageset/Contents.json | 15 ++++++ .../arrow-down.imageset/down 2.pdf | Bin 0 -> 2737 bytes .../Contents.json | 3 +- .../arrow-up.imageset/up 2.pdf | Bin 0 -> 2732 bytes .../check-mark.imageset/checkmark.pdf | Bin 4761 -> 0 bytes 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 ownCloud/Resources/Assets.xcassets/arrow-down.imageset/Contents.json create mode 100644 ownCloud/Resources/Assets.xcassets/arrow-down.imageset/down 2.pdf rename ownCloud/Resources/Assets.xcassets/{check-mark.imageset => arrow-up.imageset}/Contents.json (71%) create mode 100644 ownCloud/Resources/Assets.xcassets/arrow-up.imageset/up 2.pdf delete mode 100644 ownCloud/Resources/Assets.xcassets/check-mark.imageset/checkmark.pdf diff --git a/ownCloud/Bookmarks/BookmarkViewController.swift b/ownCloud/Bookmarks/BookmarkViewController.swift index fdf9bf2ee..34bdaa581 100644 --- a/ownCloud/Bookmarks/BookmarkViewController.swift +++ b/ownCloud/Bookmarks/BookmarkViewController.swift @@ -34,9 +34,24 @@ class BookmarkViewController: StaticTableViewController { var passwordRow : StaticTableViewRow? var tokenInfoRow : StaticTableViewRow? var deleteAuthDataButtonRow : StaticTableViewRow? + var activeTextField: UITextField? lazy var continueBarButtonItem: UIBarButtonItem = UIBarButtonItem(title: "Continue".localized, style: .done, target: self, action: #selector(handleContinue)) lazy var saveBarButtonItem: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(BookmarkViewController.userActionSave)) + lazy var nextBarButtonItem = UIBarButtonItem(image: UIImage(named: "arrow-down"), style: .plain, target: self, action: #selector(toogleTextField)) + lazy var previousBarButtonItem = UIBarButtonItem(image: UIImage(named: "arrow-up"), style: .plain, target: self, action: #selector(toogleTextField)) + lazy var inputToolbar: UIToolbar = { + var toolbar = UIToolbar() + toolbar.barStyle = .default + toolbar.isTranslucent = true + toolbar.sizeToFit() + let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(toogleTextField)) + let flexibleSpaceBarButtonItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + let fixedSpaceBarButtonItem = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) + toolbar.setItems([fixedSpaceBarButtonItem, previousBarButtonItem, fixedSpaceBarButtonItem, fixedSpaceBarButtonItem, nextBarButtonItem, flexibleSpaceBarButtonItem, doneBarButtonItem], animated: false) + toolbar.isUserInteractionEnabled = true + return toolbar + }() // MARK: - Internal storage var bookmark : OCBookmark? @@ -140,6 +155,7 @@ class BookmarkViewController: StaticTableViewController { // Credentials section + rows usernameRow = StaticTableViewRow(textFieldWithAction: { [weak self] (_, sender) in if (sender as? UITextField) != nil, self?.bookmark?.authenticationData != nil { + //sender.inputAccessoryView = inputToolbar self?.bookmark?.authenticationData = nil self?.composeSectionsAndRows(animated: true) } @@ -727,6 +743,21 @@ class BookmarkViewController: StaticTableViewController { func isAuthenticationMethodTokenBased(_ authenticationMethodIdentifier: OCAuthenticationMethodIdentifier) -> Bool { return authenticationMethodTypeForIdentifier(authenticationMethodIdentifier) == OCAuthenticationMethodType.token } + + // MARK: - Keyboard AccessoryView + @objc func toogleTextField (_ sender: UIBarButtonItem) { + if sender.style == .done { + activeTextField?.resignFirstResponder() + } else { + if passwordRow?.textField?.isFirstResponder ?? false { + // Found next responder, so set it + usernameRow?.textField?.becomeFirstResponder() + } else { + // Not found, so remove keyboard + passwordRow?.textField?.becomeFirstResponder() + } + } + } } // MARK: - OCClassSettings support @@ -759,6 +790,7 @@ extension BookmarkViewController : OCClassSettingsSupport { // MARK: - Keyboard / return key tracking extension BookmarkViewController : UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { if self.navigationItem.rightBarButtonItem == continueBarButtonItem { if !updateInputFocus() { @@ -770,6 +802,23 @@ extension BookmarkViewController : UITextFieldDelegate { return true } + + func textFieldDidBeginEditing(_ textField: UITextField) { + activeTextField = textField + if textField.isEqual(urlRow?.textField) { + textField.returnKeyType = .continue + } else if textField.isEqual(usernameRow?.textField) { + previousBarButtonItem.isEnabled = false + nextBarButtonItem.isEnabled = true + textField.inputAccessoryView = inputToolbar + textField.returnKeyType = .next + } else if textField.isEqual(passwordRow?.textField) { + previousBarButtonItem.isEnabled = true + nextBarButtonItem.isEnabled = false + textField.inputAccessoryView = inputToolbar + textField.returnKeyType = .continue + } + } } // MARK: - Password manager support diff --git a/ownCloud/Resources/Assets.xcassets/arrow-down.imageset/Contents.json b/ownCloud/Resources/Assets.xcassets/arrow-down.imageset/Contents.json new file mode 100644 index 000000000..d08f44547 --- /dev/null +++ b/ownCloud/Resources/Assets.xcassets/arrow-down.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "down 2.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/ownCloud/Resources/Assets.xcassets/arrow-down.imageset/down 2.pdf b/ownCloud/Resources/Assets.xcassets/arrow-down.imageset/down 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b7f3fba6080b90df49a703fe4e8f44800700df88 GIT binary patch literal 2737 zcmai03p`Y58{e<8)oAP6E)?QynHrPJIWx>9mwwEYkT8=Xrp$~(Bj#u>YuqX-q)#h8 z6(!bcwG~|mUEDT&R5QA#R7iHah{7+I!uOsrma@O!p5OUB=RME+oacGp|8w5|^AO$H zYs?UHDuGzt-rfE-uP6IU5r1rX=jzT_U?c`3T=!Htc?#PEc-T)qIw*vMSbmuLLp5xiwGxE zw$uBSJaU<}c51O-?!k3i(_-6Cc&;c-4!uy0EC@KGQ=K?CaJEuT{NT>*D0Vix^vW+` zX~4;#TCMQYJ%8-Yx2hT@JYPoc@@P&^I%|8{^_=6oYER=E$~gw7JiD6e35O0psW*6X zv^nM6&Zune(4+2=@4Nb|=&FiA756Ct75i)U2Szw7I2QPmf>7~E^>6}W8^S|T$ikf; zsFo5`EQ6?{=y6afCYK0NDMTApurRR<%u690aR9F?>M!CuU<$|w1_}xV+&qE>2a^G` zfdU|{iHCnbmLYcuCgh?r$Oi;vuYq`w1q%ztB-~KG5QXp*vZM$^R|l}Oo8W^n!G|Wx zOtqE8daz&%dpy%(Jg@~D{ZS-DIgSqh`~&Rs^hwb7TsWM{tS4Mm-Fx!DESFU#Gr8(g zyx`f%q70wZqV0MYA3xBsFHBAKztv%^T6b4FnjHJ$z?pI<`)g%pGh**XR6U&jiSwKL z#;~_bNOnaEds6S}k`LCY{>!|Bj-d@vJwwd{*q>R8a$+tylofnhkVCvqlh&W=etJiE zqjKfI>mT%TJ@iaZZM02Ms^;!=SWz%k;j=2)4c@f8Gq`ILc3Iz4;zI0xHobgf(S2ge zJa$ZB(6gfb-^NwB8I`=9a=;+Y)p*9|oXU1uTvD8FQ@@pCYC}ynQ`_`Rn#1=BEk)FY zc#FQ4A7{H)x~1qpy}w~~?~?5goikL6S&^6HFFS_QOLOV&g*{C%^19Qi#kKNTmnt}> z)mkT}ZSm0F&unqrea`CAzID@^3!3g2yce>EGn3v#O;gZAPx~7lpB`sa;VsI&(x1sq z`&`&k5;Ickb<5y&2alV-Fv7{Ys=45O(JL%rEyvP26WG4q?R|5mtt8obwV~TLKTWOJ zlD}AoS((?H{^0n$YjuI|HV~I}&;Q(hgb;tR@|VgAiLFU*0&&Qvq%hOKtL`>+iMikc zqvUu*Yy7?rXFDy!9qHm@1F9{>zISK;YCY&i4sd=i=(=>J^A<^>-LG7;{{BI)nEKfC zwNtJKLN}Ab@3_SrD{5Ks?>s#-foFZTD~IIhl=x!v@_C2nigNd~o|nJ|VLavD!iF5O zA}Qmb^7jn+f8S;D@*U9g-}1tW$Tbc|9#c<{d#5)hzUBVBuv4$)#z zezESzr$*DJhF>4gGU+h+XlY&f!Y{DV?opUdM* zv=a5a3*yTQOn;))+T2{!qvcxGUE6G1cK3YY8}hQjl@Twu*v|Q^Q)=i{bH%VRG@2BX zHATPQ#}T`>Ip{>$J#+_0Z++3jyru{pp69f*H!2lTX3tVy%ll*h7NaBUcMW9ghNNXi z4!^m5@*YtbeqXp+xBpDK&!Uyo&I_$Z*LTHjy56;K)vOWoGP7uMG%@pt-4XNDCA?&F z=dCWy&PFaA%^3Rt%I_kwFV@He*w{_1R@CbkCY0{lwL(F^0 zJ0Bd@pge}1ERpoKlXB#rq$T?0d>Vat&sD!;RT;08-}SVT2g&WU zRX>z3pMU0oTgK+gf)$a!w=PecVHfS|r2pn+Dd)Dl2Jud;HxtvsccfH@aXXe?Ntc$# zmxpY!QSFS|HnLUG7u~hve|qc{I(O>Y4C!%U?NhtvW=1-M990&t>K-UxdeJ$ukI`5D zGwJ!(RVAD09}M*s2e$PnH@?m4^T}7vY1y^sRqU`)c2<<MFb>2UGr@Uwj26dfSo$@w(hv$nXHwKmDF^h7Ko%|{e<@&4%Ba5y zEQ#Pu{H0G8U&ar{0!KMssv-ArZblHz7bG?oCN>#c8;CjTh!nyXx^bb6s6;Bl#1I0T zBbMeA$d}|G7X|x62!my1>1zUc$oUdk1OzBuT_qHCiaA)`xW!oYBe7RfV1x-%VFoCK zmR7XQFuWYx>I+6py9V4elK2^nsnDU0fN zfE625BLbpnMO-m|{2kJ~kK?b9paBFJLTCiAHO&RltgNV3PynRSQ4mXzSNwv+V>*~h z0l(9iI)rWs7Wt(PhCyNeT1SP!FZ-39<>VL$9i9{ewwkO%XpBjA2!jI3{+BTj2K{ez z%t>oOnDj~epujYM@0b24Fmpm&nS?J2MkVS#kSmG+SkoZTjbPx!;HLs)%1Io6f#Wke zW`hG{!w@i#0D+Lo;4={>m5vDD06I-*DL`l_oyOz~>OI9iTM!97|aNBO7_ z6QPie4M8TCqJkKL@^5H{ounSpaTq?-U9c@Y2cSmn7Nod{RceF0*RA1=PT#wAs1$1hirFK>Vha1?iw)@DhExIe7?e{sZd%rxz zUK9=)3_Po+M3&SwmOezkOW66Yd0-zS?40$MilS%B-O_6Jo%Gi=rq_#mp9TkZb}o5N zOh1u0&+u{Vm2T|<|HJ#z*8fC6C8CLs12dcxoCy3*LtuPSJ)K6^`nXLfWZ@x*RF6_r zB8TYX)On#YOd%DbGKe(}@GyxStji#rZosV@DiRCqF(niP1As;YR|vtv3zGw?0RU*8 z*bjeyGCUqqOz4fup&+m+-w_IdEO=NnCiUJV5TXzsKb{PM*y;^zY^M3(O!F}jVy@cC zVjVcJg&iJd3BIufAN@frM7^Bs|2q0Re1g&qd=`Jo;@%)!Zo2bpo7pj5mE7dA>-j~G zj#uOcWmSAnJo}(c&#pWxOLXh?il()9L0VsSW=XH&c3Sj{h}iBRhI0=&jSxzg*R(g zkG}Ypc+8V%`m?WfrmAVd7W-ADA8UeaGu&Z6b7F;hoahER_dNq{f-f)Q&#h}Law&y>1_LdC^eOdXVNT& zyMCDGQR|**@bK<>hoNQP-*d@rGUO#(OuOh5$G&ik?NL71k*sJq)ns^Gp>wXr%d}qe z@a#}e?Va2%r)~dcp4+i@PG@OH>(Vzu{-^vsFB4}g*_%#@j1J97CDjCok6jwc_s;%M z-c^}AcHRHh(ig8oyh|3xJ6qOumcFTYj-{{hVp!$_+ZWpc8nvvY87>Y+?qB_=Q4?BX zsK>1>9?EGuq-Yu^d2Cjovl4uTO+kL8A>OA45}>8U+Uk`LSJSceuh(d zDE>*>j@K?Wnns&*BzdDvq345d&pToH&Yc?J@+Q3h+@-!-6sh)z%5mM@z5dBJw&$#w zbu|)d+!NR8o}5?Fwd$KyN!}H|=OX@j%DqwaHtCWo`F{$ab6iv3d!Y7VS)wKrS84jp+@Bk7h;Hq!VMP8$N38 zA_kPERhOFn$hvOTxMWb%t!m(Ur*+lsvhtVImG4%^KMl2>|3UA9k^i+zM(vxDD9Hu0 z3`T;Suq%O4hpXXy)R@3{=JRx1(n(BA8e}}Ekn0b|15;cjOf57H|dDgO!40D$- z*G?CbYuJT%msJ@FZ&%RtW#j?9J8dOpmG=+&bE((?(*B--d83|j_k2tS(yhqFPeaP0 zW1CfZ*zro~P%ouO@m}_ue|JD@uscVi^W(v#Wv_>Cd`< zGJQw;LRT!OPmBzPbk^}N{#L%l6x9 zkdFL<>mt|0-tZkS0}aho&iW4&K5zmy}ZPOFab zvufIsx^XN_Ih@qL`9DPdD!tZ*9wT;YY_CTDg8T&gn1ibGwgaQp%g?$b40DF7k5C?m z*;WR!|1dI8?%p`4@_kh>98{v3-?cU6`Swqw!h%GfFC`WiB3$1Pn9ZHkJY2$X4CtIQ zk7qBCp&|&^FfS-%(gfGpNm-ndVcAS!Wg#?(&84Z8QUT-{fh=6bA{kIn+PJ@IDv97q z{JBq_KrV>JBF8meHX-g)+KeC*Z%}+TnM|Gx>^Sa*5+e}0dqcjcR3^qG5CWSc409S3 zOtDvpqeT$H;V~J(CXlB>AeF~MK+x4SLMfl}H2IN~Ph-I_47=fj03YOk4jb{A_|F9y zK7;UK4L*Fp2epX=pP^H(C#yciLm-yOd3b53nS=g2im=r=LiXtdqB83oi6l#jVIuA4wa@=5|D5{?USA0;5 z2*^Yi;)aRvXK3PiihZRNjUd1f!XkiAoA^O2CX>#DBA^KjoEW&le~@GngXy#{Foewj z(Vt-lgR(pmqr;#e&#+_A!5{W>3}M4x>;W^s#1Ize3p<2E1BA`+$6@~;j01pYuWbSTX60 z2&N!hAfT~XLK-UqFvw+sK7=U}u{c5++lKJhCZK~+_mdz2)WM|Dm`nnh?BMQ5_#e%o B1)=}| literal 0 HcmV?d00001 diff --git a/ownCloud/Resources/Assets.xcassets/check-mark.imageset/checkmark.pdf b/ownCloud/Resources/Assets.xcassets/check-mark.imageset/checkmark.pdf deleted file mode 100644 index 3f261286a8fbaa147d0a63258c2676eb21b6477f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4761 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 SKN