Swift4: хотите использовать переменную UIViewController с пользовательским классом UIButton - PullRequest
0 голосов
/ 23 октября 2018

В настоящее время я применяю пользовательский класс SAFavoriteBtn к UIButton.Я написал код для получения API, когда кнопка была нажата в этом классе, я назначил параметры для получения данных API для переменных UIViewController, я хочу использовать переменную в SAFavoriteBtn.В этом случае как передать значение?И этот шаблон использует segue?

UIViewController

class StoreViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate, UICollectionViewDelegateFlowLayout,UITableViewDelegate, UITableViewDataSource {


var store_id = ""
var instaId = ""
var store = [Store]()
var photoPath = [Store.photos]()
var tag = [Store.tags]()
var selectedImage : UIImage?
let defaultValues = UserDefaults.standard


@IBOutlet weak var imageCollectionView: UICollectionView!
@IBOutlet weak var mainImage: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var locationLabel: UILabel!
@IBOutlet weak var UIView: UIView!
@IBOutlet weak var tagCollectionView: UICollectionView!
@IBOutlet weak var tableView: UITableView!


override func viewDidLoad() {
    super.viewDidLoad()



    //Collectiopn DetaSources
    imageCollectionView.dataSource = self
    imageCollectionView.delegate = self

    tagCollectionView.dataSource = self
    tagCollectionView.delegate = self

    tableView.dataSource = self
    tableView.delegate = self

    //Navigation Color
    self.navigationController!.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController!.navigationBar.shadowImage = UIImage()
    navigationController!.navigationBar.topItem!.title = ""
    navigationController!.navigationBar.tintColor = UIColor.white

    //UIView Shadow
    let shadowPath = UIBezierPath(rect: UIView.bounds)
    UIView.layer.masksToBounds = false
    UIView.layer.shadowColor = UIColor.black.cgColor
    UIView.layer.shadowOffset = .zero
    UIView.layer.shadowOpacity = 0.2
    UIView.layer.shadowPath = shadowPath.cgPath

    //Request API
    let url = URL(string: "http://example.com/store/api?store_id=" + store_id)
    let request = URLRequest(url: url!)
    let session = URLSession.shared

    let encoder: JSONEncoder = JSONEncoder()
    encoder.dateEncodingStrategy = .iso8601
    encoder.outputFormatting = .prettyPrinted

    session.dataTask(with: request){(data, response, error)in if error == nil,
        let data = data,
        let response = response as? HTTPURLResponse{

        let decoder: JSONDecoder = JSONDecoder()
        decoder.dateDecodingStrategy = .iso8601
        do {

            let json = try decoder.decode(Store.self, from: data)

            self.store = [json]
            self.photoPath = json.photos
            self.tag = json.tags

            if let imageURL = URL(string: "http://example.com/photos/" + json.photos[0].path){
                DispatchQueue.global().async {
                    let data = try? Data(contentsOf: imageURL)
                    if let data = data {
                        let image = UIImage(data: data)
                        DispatchQueue.main.async {
                            self.mainImage.image = image
                        }
                    }
                }
            }else if let imageURL = URL(string: "http://example.com/photos/" + json.photos[0].path.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!){
                DispatchQueue.global().async {
                    let data = try? Data(contentsOf: imageURL)
                    if let data = data {
                        let image = UIImage(data: data)
                        DispatchQueue.main.async {
                            self.mainImage.image = image
                        }
                    }
                }
            }
            DispatchQueue.main.async {
                self.nameLabel.text = json.name
                self.locationLabel.text = json.location
                self.tableView.reloadData()
                self.imageCollectionView.reloadData()
                self.tagCollectionView.reloadData()

            }

        } catch {
            print("error:", error.localizedDescription)

        }

        }

        }.resume()

    print(store)

    //print(defaultValues.string(forKey: "id"))


    // Image Collection view Layout
    let itemSize = UIScreen.main.bounds.width/3.62 - 3.62

    let layout = UICollectionViewFlowLayout()

    layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
    layout.itemSize = CGSize(width: itemSize, height: itemSize)

    layout.minimumInteritemSpacing = 1
    layout.minimumLineSpacing = 1

    imageCollectionView.collectionViewLayout = layout

    // Tag Collection View
    let tagLayout = UICollectionViewFlowLayout()

    tagLayout.minimumLineSpacing = 1
    tagLayout.minimumInteritemSpacing = 1
    tagLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
    tagLayout.itemSize = CGSize(width: 80, height: 24)
    tagCollectionView.collectionViewLayout = tagLayout

    //status bar color
    self.setNeedsStatusBarAppearanceUpdate()

}

override var prefersStatusBarHidden: Bool {
    return false
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}


override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
//        UI coner redius
    let uiViewPath = UIBezierPath(roundedRect: UIView.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 8, height: 8))
    let uiViewMask = CAShapeLayer()
    uiViewMask.path = uiViewPath.cgPath
    UIView.layer.mask = uiViewMask
    navigationController!.navigationBar.topItem!.title = " "

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//Collection
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView == self.imageCollectionView{
        let imageCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell",for: indexPath)
        let imageView = imageCell.contentView.viewWithTag(1) as! UIImageView
        let textLabel = imageCell.contentView.viewWithTag(2) as! UILabel
        let instaBtn = imageCell.contentView.viewWithTag(3) as! UIButton

        instaBtn.tag = indexPath.row

        if photoPath.count > indexPath.row{
            if collectionView == self.imageCollectionView{
                let url : String = "http://example.com/photos/" + photoPath[indexPath.row].path
                let imageURL = URL(string: url)
                print(url)

                if imageURL != nil {
                    DispatchQueue.global().async {
                        let data = try? Data(contentsOf: imageURL!)
                        if let data = data {
                            let image = UIImage(data: data)
                            DispatchQueue.main.async {
                                imageCell.layer.masksToBounds = true;
                                imageCell.layer.cornerRadius = 3
                                imageView.image = image
                                textLabel.text = self.photoPath[indexPath.row].username
                                print(self.photoPath[indexPath.row].username)
                            }
                        }
                    }
                }else{
                    let encodeURL : String = "http://example.com/photos/" + photoPath[indexPath.row].path
                    let url = URL(string: encodeURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)
                    DispatchQueue.global().async {
                        let data = try? Data(contentsOf: url!)
                        if let data = data {
                            let image = UIImage(data: data)
                            DispatchQueue.main.async {
                                imageCell.layer.masksToBounds = true;
                                imageCell.layer.cornerRadius = 3
                                imageView.image = image
                                textLabel.text = self.photoPath[indexPath.row].username
                                print(self.photoPath[indexPath.row].username)
                            }
                        }
                    }
                }
            }
        }
        instaBtn.addTarget(self, action: #selector(self.instaBtnTapped), for: UIControlEvents.touchUpInside)
        imageCell.addSubview(instaBtn)
        return imageCell


     //Tag collection view
    }else if collectionView == self.tagCollectionView{
        let tagCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagCell",for: indexPath)
        let tagLabel = tagCell.contentView.viewWithTag(2) as! UILabel

        if tag.count > indexPath.row{
            tagLabel.text = tag[indexPath.row].name
        }
        tagCell.layer.cornerRadius = 12
        return tagCell
    }else{
    return UICollectionViewCell()
}
}

//tapped instaBtn jump insta user page function
@objc func instaBtnTapped(sender: UIButton){

    instaId = photoPath[sender.tag].username
    let url = URL(string: "https://www.instagram.com/"+instaId+"/")
    UIApplication.shared.open(url!, options: [ : ], completionHandler: nil)
    print (sender.tag)
}




func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView,
                    numberOfItemsInSection section: Int) -> Int {
    return photoPath.count > 0 ? 3 : 0
}

func tagcollectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return tag.count > 0 ? tag.count : 0
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 3
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    switch section {
    case 0:
        return store.count > 0 ? 1 : 0
    case 1 :
        return store.count > 0 ? 1 : 0
    case 2 :
        return store.count > 0 ? 1 : 0
    default:
        return 0
    }
}

//Collection view tap
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    if collectionView == self.imageCollectionView{
        let url : String = "http://example.com/photos/" + photoPath[indexPath.row].path
        let imageURL = URL(string: url)
        print(url)

        if imageURL != nil {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: imageURL!)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        self.mainImage.image = image

                    }
                }
            }
        }else{
            let encodeURL : String = "http://example.com/photos/" + photoPath[indexPath.row].path
            let url = URL(string: encodeURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)

            DispatchQueue.global().async {
                let data = try? Data(contentsOf: url!)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        self.mainImage.image = image

                    }
                }
            }
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = UITableViewCell()

    switch indexPath.section {
    case 0 :
    //Price Cell
    guard let priceCell = tableView.dequeueReusableCell(withIdentifier: "priceCell", for: indexPath) as? priceTableViewCell else { return UITableViewCell()}

    if let price:String = store[indexPath.row].price{
        priceCell.priceLabel.text! = price
    }else{
        priceCell.priceLabel.text! = "-"
    }
    return priceCell

    case 1 :
    //timeCell

        guard let timeCell = tableView.dequeueReusableCell(withIdentifier: "timeCell", for: indexPath) as? timeTableViewCell else{return UITableViewCell()}

        if let time:String = store[indexPath.row].open_time{
            timeCell.timeLabel.text! = time
        }else{
            timeCell.timeLabel.text! = "-"
        }
        return timeCell

    case 2 :
    //closedayCell
        guard let closedayCell = tableView.dequeueReusableCell(withIdentifier: "closedayCell", for: indexPath) as? closedayTableViewCell else { return UITableViewCell() }

    if let closeday:String = store[indexPath.row].closed_day{
        closedayCell.closedayLabel.text! = closeday
    }else{
        closedayCell.closedayLabel.text! = "-"
        }

        return closedayCell

    default :
        print("Default Selected")
    }
    return cell
}

@IBAction func moreImageBtn(_ sender: Any) {
    let store_id = self.store_id
    self.performSegue(withIdentifier: "toStorePhotoViewController", sender: store_id)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toStorePhotoViewController"{
        let storePhotoViewController = segue.destination as! StorePhotoViewController
        storePhotoViewController.store_id = sender as! String
    }
}

//This is SAFavoriteBtn
//Bookmark Button
@IBAction func bookmarkBtn(_ sender: SAFavoriteBtn) {

}

@IBAction func locationBtn(_ sender: Any) {
    let lat = store[0].lat
    let lng = store[0].lng

    if UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!){
        let urlStr : String = "comgooglemaps://?daddr=\(lat),\(lng)&directionsmode=walking&zoom=14"
        UIApplication.shared.open(URL(string:urlStr)!,options: [:], completionHandler: nil)
    }else{
        let daddr = String(format: "%f,%f", lat, lng)
        let urlString = "http://maps.apple.com/?daddr=\(daddr)&dirflg=w"
        let encodeUrl = urlString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)!

        let url = URL(string: encodeUrl)!
        UIApplication.shared.open(url,options: [:], completionHandler: nil)
    }
}



}

SAFavoriteBtn

import UIKit

class SAFavoriteBtn: UIButton {

var isOn = false
let defaultValues = UserDefaults.standard

//Want to use the variable of UIViewController with UIButton custom class in this part
var storeId = ""

override init(frame: CGRect) {
    super.init(frame:frame)
    initButton()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initButton()
}

func initButton() {

    setImage(UIImage(named:"bookmark.png"), for: UIControlState.normal)
    addTarget(self, action:  #selector(SAFavoriteBtn.buttonPressed), for: .touchUpInside)
}

@objc func buttonPressed() {
    activateBtn(bool: !isOn)
}

func activateBtn(bool : Bool){
    isOn = bool

    //UI
    let image = bool ? "bookmark_after.png" : "bookmark.png"
    setImage(UIImage(named: image), for: UIControlState.normal)
    //API
    bool ? favorite() : deleteFavorite()
}

func favorite(){
    let user_id = defaultValues.string(forKey: "userId")
    let url = URL(string: "http://example.com/api/store/favorite?")
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    let postParameters = "user_id=" + user_id! + "&store_id=" + storeId
    request.httpBody = postParameters.data(using: .utf8)
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if error == nil, let data = data, let response = response as? HTTPURLResponse {

            print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")

            print("statusCode: \(response.statusCode)")
            print(String(data: data, encoding: .utf8) ?? "")
        }
        }.resume()
    print("favorite")
}

func deleteFavorite(){
    let user_id = defaultValues.string(forKey: "userId")
    let url = URL(string: "http://example.com/api/store/favorite?")
    var request = URLRequest(url: url!)

    request.httpMethod = "POST"
    let postParameters = "user_id=" + user_id! + "&store_id=" + storeId
    request.httpBody = postParameters.data(using: .utf8)
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if error == nil, let data = data, let response = response as? HTTPURLResponse {

            print("Content-Type: \(response.allHeaderFields["Content-Type"] ?? "")")

            print("statusCode: \(response.statusCode)")
            print(String(data: data, encoding: .utf8) ?? "")
        }
        }.resume()
    print("delete")
   }
}
...