Как я могу вынудить длинную строку без какого-либо пробела быть перенесенной?

Ну, я пытался добавить кое-что в ваш код, но это немного сложно для чтения. Вы должны действительно подумать о рефакторинге.

В любом случае, проблема в том, что вы никогда не ждете, пока результат запроса вернется, и просто даете ему выполнить. Помните, что Firebase является асинхронным. В вашем случае я предлагаю вам использовать блок завершения для метода isValidUsername. Вот код для вас. Не уверен, что он будет работать, поскольку я не могу скомпилировать без создания всех компонентов пользовательского интерфейса, которые у вас есть. В приведенном ниже коде я удалил кучу вашего кода, который изменяет пользовательский интерфейс, если он не проверен. Я также удалил ваши проверенные переменные, так как в этом случае они вам больше не понадобятся. Я прокомментировал весь код, который я добавил, чтобы вам было легче его понять.

@IBAction func onSignUp(_ sender: Any) {

        print("Sign Up pressed")
        guard let email = emailTextField.text else { return }
        guard let password = passwordTextField.text else { return }
        guard let userName = usernameTextField.text else { return }

        if isValidEmail(email: email) && isValidPassword(password: password) {
            // HERE YOU USE THE CLOSURE
            isValidUsername(username: userName) { (verified, error) in
                if error != nil {
                    // IF THERE IS ERROR RETURN
                    return
                }
                guard let verified = verified else { return }
                // IF IT IS A VALID USERNAME, PROCEED WITH SIGNUP
                if verified {
                    Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
                        if error != nil {
                            return
                        }

                        guard let user = authResult?.user else {
                            return
                        }

                        //Successfully Authenticated User
                        let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
                        let usersReference = ref.child("users").child(user.uid)
                        let values = ["username": self.usernameTextField.text!, "email": self.emailTextField.text!, "games-played": "0"]
                        usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
                            if err != nil {
                                print(err!)
                                return
                            }

                            //Successfully registered user's data to database
                            print("[SIGN UP] - Successfully Signed Up")
                            self.present((self.storyboard?.instantiateViewController(withIdentifier: "TabBarViewController"))!, animated: false, completion: nil)


                        })
                    }
                }
            }
        } else {

        }

    }

    //MARKUP: Validations/Verifications
    //Email Verification (Must follow correct email format: example@gmail.com)
    func isValidEmail(email: String) -> Bool {

        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
        if valid {
            valid = !email.contains("Invalid email id")
        }

        if valid == false {

            return false

        } else {

            return true
        }
    }


    //Password Verification (Must be greater than 8 digits
    func isValidPassword(password: String) -> Bool {

        let passwordRegex = ".{8,}"
        var valid = NSPredicate(format: "SELF MATCHES %@", passwordRegex).evaluate(with: password)

        if valid {
            valid = !password.contains("Invalid password id")
        }

        if valid == false {

            return false

        } else {

            return true
        }
    }

    //Username Verification (Must be between 3-15 charaters w/ username not taken)
    // HERE IS A CLOSURE
    typealias validateClosure = (Bool?, Error?) -> Void
    func isValidUsername(username: String, completion: @escaping validateClosure) {
        let usernameRegex = ".{3,15}"
        var valid = NSPredicate(format: "SELF MATCHES %@", usernameRegex).evaluate(with: username)

        if valid {
            valid = !username.contains("Invalid username id")
        }

        if valid == false {

        } else {
            let ref = Database.database().reference(fromURL: "https://heytest.firebaseio.com/")
            let usernamesRef = ref.child("users")
            usernamesRef.queryOrdered(byChild: "username").queryEqual(toValue: username).observeSingleEvent(of: .value, with: { (snapshot) in
                // if there is data in the snapshot reject the registration else allow it

                if (snapshot.value! is NSNull) {
                    // RETURN TRUE IF VERIFIED
                    completion(true, nil)

                } else {
                    // RETURN FALSE IF NOT VARIFIED
                    completion(false, nil)

                }

            }) { (error) in
                // RETURN FALSE AND THE ERROR
                completion(false, error)
                print(error.localizedDescription)
            }

        }
    }

Надеюсь, это поможет. И, пожалуйста, действительно подумайте о переносе всего кода, который выполняет сетевые вызовы и бизнес-логику, в другой класс и из viewController. Это сделает вашу жизнь намного легче позже.

183
задан double-beep 24 April 2019 в 02:29
поделиться

4 ответа

для элементов блока:

<textarea style="width:100px; word-wrap:break-word;">
  ACTGATCGAGCTGAAGCGCAGTGCGATGCTTCGATGATGCTGACGATGCTACGATGCGAGCATCTACGATCAGTC
</textarea>

для встроенных элементов:

<span style="width:100px; word-wrap:break-word; display:inline-block;"> 
   ACTGATCGAGCTGAAGCGCAGTGCGATGCTTCGATGATGCTGACGATGCTACGATGCGAGCATCTACGATCAGTC
</span>
264
ответ дан Mahozad 23 November 2019 в 06:00
поделиться

Я не думаю, что можно сделать это с CSS. Вместо этого в регулярных 'длинах слова' вдоль строки вставьте мягкий перенос HTML:

ACTGATCG&shy;AGCTGAAG&shy;CGCAGTGC&shy;GATGCTTC&shy;GATGATGC&shy;TGACGATG

Это отобразит дефис в конце строки, где она переносится, который может или не может быть тем, что Вы хотите.

Safari Примечания, кажется, переносит длинную строку в <textarea> так или иначе, в отличие от Firefox.

12
ответ дан Peter Hilton 23 November 2019 в 06:00
поделиться

Place zero-width spaces at the points where you want to allow breaks. The zero-width space is in HTML. For example:

ACTGATCG​AGCTGAAG​CGCAGTGC​GATGCTTC​GATGATGC

104
ответ дан 23 November 2019 в 06:00
поделиться

Для меня это работает,

<td width="170px" style="word-wrap:break-word;">
  <div style="width:140px;overflow:auto">
    LONGTEXTGOESHERELONGDIVGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESLONGTEXTGOESHERELONGDIVLONGTEXTLONGTEXT
  </div>
</td>

Вы также можете использовать div внутри другого div вместо td. Я использовал overflow:auto, так как он показывает весь текст как в браузере Opera, так и в IE.

18
ответ дан 23 November 2019 в 06:00
поделиться