Текст изменения UIButton отправителя Swift

У меня есть кнопка подписки/отписки, и я обращаюсь к ней через «отправителя». Я меняю текст, когда пользователь нажимает на него, чтобы подписаться или отписаться от другого пользователя. Проблема в том, что когда он должен показывать «отписаться», он показывает текст по умолчанию, используемый в раскадровке. Кнопка меняется на «подписаться», как и должно быть, но не на «отписаться». Кроме того, я должен использовать «отправитель: UIButton», потому что я получаю доступ к «тегу» ячеек таблицы для получения правильной информации.

@IBAction func followButton(_ sender: UIButton) {
    //self.yourFollowing.removeAll()
    //self.following.removeAll()
    self.followingTableView.reloadData()

    let accessData = self.yourFollowing[sender.tag].dataPass
    let businessUid = accessData["uid"] as! String
    let businessName = accessData["businessName"] as! String
    let businessStreet = accessData["businessStreet"] as! String
    let businessCity = accessData["businessCity"] as! String
    let businessState = accessData["businessState"] as! String
    let businessZip = accessData["businessZIP"] as! String
    let businessPhone = accessData["businessPhone"] as! String
    let businessLatitude = accessData["businessLatitude"] as! String
    let businessLongitude = accessData["businessLongitude"] as! String
    let businessWebsite = accessData["businessWebsite"] as! String

    let businessFacebook = accessData["facebookURL"] as! String
    let businessFoursquare = accessData["foursquareURL"] as! String
    let businessGoogle = accessData["googleURL"] as! String
    let businessInstagram = accessData["instagramURL"] as! String
    let businessSnapchat = accessData["snapchatURL"] as! String
    let businessTwitter = accessData["twitterURL"] as! String
    let businessYelp = accessData["yelpURL"] as! String


    let userID = Auth.auth().currentUser!.uid
    let ref = Database.database().reference()
    let key = ref.child("Businesses").childByAutoId().key
    var isFollower = false

    let followersRef = "followers/\(businessUid)/\(self.loggedInUserData?["uid"] as! String)"
    let followingRef = "following/" + (self.loggedInUserData?["uid"] as! String) + "/" + (businessUid)


    ref.child("Businesses").child(userID).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in

        if let following = snapshot.value as? [String : AnyObject] {
            for (item, value) in following {
                if value as! String == businessUid {
                    isFollower = true

                    let followersRef = "followers/\(businessUid)/\(self.loggedInUserData?["uid"] as! String)"
                    let followingRef = "following/" + (self.loggedInUserData?["uid"] as! String) + "/" + (businessUid)

                    let childUpdates = [followingRef:NSNull(),followersRef:NSNull()]
                    self.databaseRef.updateChildValues(childUpdates)

                    ref.child("Businesses").child(userID).child("following/\(item)").removeValue()
                    ref.child("Businesses").child(businessUid).child("followers/\(item)").removeValue()


                    sender.titleLabel?.text = "follow"



                    //self.yourFollowing.removeAll()
                    self.following.removeAll()
                    self.followingTableView.reloadData()
                }
            }
        }

        // Follow
        if !isFollower {

            sender.titleLabel?.text = "unfollow"

            let followersData = ["email":self.loggedInUserData?["email"] as! String, "businessName":self.loggedInUserData?["businessName"] as! String]
            let followingData = ["businessName":businessName, "businessStreet":businessStreet, "businessCity":businessCity, "businessState":businessState, "businessZIP":businessZip, "businessPhone":businessPhone, "businessWebsite":businessWebsite,"businessLatitude":businessLatitude, "businessLongitude":businessLongitude, "facebookURL":businessFacebook, "twitterURL":businessTwitter, "instagramURL":businessInstagram, "googleURL":businessGoogle, "yelpURL":businessYelp, "foursquareURL":businessFoursquare, "snapchatURL":businessSnapchat, "uid":businessUid]


            let childUpdates = [followersRef:followersData, followingRef:followingData]
            self.databaseRef.updateChildValues(childUpdates)

            let following = ["following/\(key)" : businessUid]
            let followers = ["followers/\(key)" : userID]

            ref.child("Businesses").child(userID).updateChildValues(following as Any as! [AnyHashable : Any])
            ref.child("Businesses").child(businessUid).updateChildValues(followers)




            self.yourFollowing.removeAll()
            self.following.removeAll()
            self.followingTableView.reloadData()
        }
    })



}

person Lukas Bimba    schedule 27.09.2018    source источник
comment
Во-первых, похоже, что вы делаете что-то в обратном порядке... в своем коде вы устанавливаете isFollower = true, а затем устанавливаете заголовок кнопки для отслеживания, а if !isFollower (имеется в виду, если isFollower имеет значение false) устанавливаете заголовок для отказа от подписки? Вроде должно быть наоборот. Кроме того, вы должны использовать sender.setTitle("follow", for: .normal) вместо установки текста метки кнопки.   -  person DonMag    schedule 27.09.2018
comment
Я бы предложил удалить весь посторонний код (вы включили несколько десятков строк), а затем протестировать. Это может выявить реальную проблему? И, конечно же, если нет, опубликуйте этот код, чтобы мы могли его дублировать.   -  person dfd    schedule 27.09.2018


Ответы (1)


Ваша проблема в этой строке в вашем действии кнопки

@IBAction func followButton(_ sender: UIButton) {
    .
    .
    var isFollower = false
    .
    .
}

Вы объявляете переменную isFollow внутри действия кнопки. Это означает, что каждый раз, независимо от подписки или отказа от подписки, ваше isFollower равно false, поэтому условие для подписки будет работать. Но изменение на true, которое находится внутри завершения подписки, не отразится в следующий раз, когда вы нажмете кнопку, потому что вы сбрасываете isFollower на false.

Решение. Переместите переменную isFollow за пределы действия кнопки.

var isFollow = false

@IBAction func followButton(_ sender: UIButton) {
     // Your logic
}

Также ваша логика внутри завершения кажется неправильной. Что-то вроде кода ниже должно быть там, чтобы изменить его на false.

if value as! String == businessUid {
    isFollower = !isFollower
    if isFollower {
        // Follow logic
        sender.setTitle("unfollow", for: .normal)
    } else {
        // Unfollowed logic
        sender.setTitle("follow", for: .normal)
    }
    // Reload table
}
person Rakesha Shastri    schedule 27.09.2018
comment
если вы использовали isFollow, что нет необходимости указывать тип, Swift делает вывод, что - person Abid Nawaz; 27.09.2018
comment
@АбидНаваз Да. Я взял за привычку указывать тип рядом с переменной для аккуратности и ясности. - person Rakesha Shastri; 27.09.2018
comment
Я не думаю, что это правильно... OP делает объявление var isFollower = false внутри функции, но затем, если условия соблюдены, код включает строку isFollower = true. Итак, когда выполнение кода доходит до строки if !isFollower {, возможно значение изменилось. - person DonMag; 27.09.2018
comment
@DonMag да, я внимательно прочитал это и все еще пытаюсь понять, что делает его код. Кажется, у него есть вызов API, который он будет обрабатывать следующим образом, если он будет успешным. Итак, означает ли это, что для отписки не нужно вызывать API? Или он должен инвертировать isFollower внутри вызова API. Если да, то почему его логика отписки снаружи? - person Rakesha Shastri; 27.09.2018
comment
@LukasBimba, для чего нужен этот вызов API? Обновление статуса подписки на отписку? - person Rakesha Shastri; 27.09.2018
comment
да, у них обоих есть вызовы для обновления или удаления дочерних элементов в зависимости от того, следит ли пользователь за другим пользователем или отписывается от него. - person Lukas Bimba; 27.09.2018
comment
@LukasBimba, кажется, есть какая-то логическая проблема в вашем завершении API. - person Rakesha Shastri; 27.09.2018
comment
@LukasBimba не тот. Текущий. - person Rakesha Shastri; 27.09.2018
comment
@LukasBimba - вы проверили свой код в отладке, чтобы убедиться, что он делает то, что вы думаете? - person DonMag; 27.09.2018
comment
Теперь проблема в том, что когда контроллер представления загружается, он имеет текст по умолчанию, потому что setTitle работает вне действий. - person Lukas Bimba; 27.09.2018
comment
Когда я нажимаю кнопку «Отписаться», текст кнопки меняется правильно. - person Lukas Bimba; 27.09.2018
comment
@LukasBimba Лучшим решением было бы, чтобы API предоставил вам информацию о том, собирается ли он измениться, чтобы подписаться или отказаться от подписки, потому что тогда все, что вы делаете в Интернете, также должно быть отражено. Если это невозможно, вам может понадобиться использовать userdefaults для сохранения состояния кнопки. - person Rakesha Shastri; 27.09.2018
comment
я просто установил текст по умолчанию для отмены подписки, так как это следующая страница, и не будет данных, если пользователь не следит за людьми - person Lukas Bimba; 27.09.2018
comment
Можете ли вы попробовать заменить метод sender.titleLabel?.text на метод sender.setTitle? И дать попробовать? - person Ashish; 27.09.2018